遗留代码以这种方式执行此操作:
public bool isValidField(string tableName, string fieldName)
{
bool retVal;
string tblQuery = string.Format("SELECT {0} FROM {1}", fieldName, tableName);
checkConnection();
try
{
SqlCeCommand cmd = objCon.CreateCommand();
cmd.CommandText = tblQuery;
object objvalid = cmd.ExecuteScalar();
retVal = (null != objvalid);
}
catch
{
retVal = false;
}
return retVal;
}
…但是我发现它并不总是有效。调用该方法并获取后false
,一些代码会在表中更改以添加一些列,但是我得到了:
列ID在规范中出现了多次。
我在StackOverflow上发现了两个很有希望的SQL语句:
if exists(select * from sys.columns
where Name = N'columnName' and Object_ID = Object_ID(N'tableName'))
和
IF COL_LENGTH('table_name','column_name') IS NULL
…但是不确定如何在C#/ .NET 1.1中实现
我是否需要使用ExecuteScalar并将返回的值转换为布尔值?或者是其他东西?
将其更改为此并不能解决问题:
public bool isValidField(string tableName, string columnName)
{
bool retVal;
string tblQuery = string.Format(
"COL_LENGTH({0},{1}) IS NULL",
tableName,
columnName);
checkConnection();
try
{
SqlCeCommand cmd = objCon.CreateCommand();
cmd.CommandText = tblQuery;
object objvalid = cmd.ExecuteScalar();
retVal = Convert.ToBoolean(objvalid);
}
catch
{
retVal = false;
}
return retVal;
}
奇怪的是,我在新代码中看到了更多的错误消息。
当我以这种方式更改代码时,它没有什么不同:
string tblQuery = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS"
+ " WHERE TABLE_NAME = @tableName AND COLUMN_NAME"
+ " = @columnName";
checkConnection();
try
{
SqlCeCommand cmd = objCon.CreateCommand();
cmd.CommandText = tblQuery;
SqlCeParameter tblNameParam = new SqlCeParameter(
"@tableName",
SqlDbType.NVarChar,
128);
tblNameParam.Value = tableName;
cmd.Parameters.Add(tblNameParam);
SqlCeParameter colNameParam = new SqlCeParameter(
"@columnName",
SqlDbType.NVarChar,
128);
colNameParam.Value = tableName;
cmd.Parameters.Add(colNameParam);
int i = (int)cmd.ExecuteScalar();
retVal = i > 0;
}
…所以我不知道哪种方法更可取;对我来说,这似乎更直接了……任何想法,任何人?
您可以只查询信息模式表以获取所需的信息:
public bool isValidField(string tableName, string columnName)
{
var tblQuery = "SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS"
+ " WHERE TABLE_NAME = @tableName AND"
+ " COLUMN_NAME = @columnName";
SqlCeCommand cmd = objCon.CreateCommand();
cmd.CommandText = tblQuery;
var tblNameParam = new SqlCeParameter(
"@tableName",
SqlDbType.NVarChar,
128);
tblNameParam.Value = tableName
cmd.Parameters.Add(tblNameParam);
var colNameParam = new SqlCeParameter(
"@columnName",
SqlDbType.NVarChar,
128);
colNameParam.Value = columnName
cmd.Parameters.Add(colNameParam);
object objvalid = cmd.ExecuteScalar(); // will return 1 or null
return objvalid != null;
}
问题内容: 我有一个需要用户输入密码的应用程序。 我想要做的是从控制台读取密码(如果操作系统支持unix)或显示JOptionPane并要求用户输入密码(如果操作系统支持图形界面(例如Windows))。 有人可能会争辩说,在上述两种情况下控制台始终可用,因此控制台输入就足够了。但是问题是,如果Java应用程序开始使用javaw.exe,则控制台不可用。因此,我需要一种方法来确定我是否可以做任何一
问题内容: 由于ResultSet包含从动态SQL返回的数据,是否有任何方法可以确定ResultSet是否包含特定的列名?例如,如果我运行但Column_ABC确实不存在,它将抛出异常。如何测试ResultSet是否可以从名为“ Column_ABC”的列中获取数据? 问题答案: 使用该类。 我不明白的是为什么会需要此功能。正在执行的查询或存储过程应具有已知结果。查询的列应该是已知的。需要这样的功
问题内容: 在JMS中,很容易找出连接是否丢失,是否发生异常。但是,如何确定连接是否再次存在? 场景:我使用JMS与服务器通信。现在我的连接断开了(服务器已关闭),这导致了异常。到目前为止,一切都很好。如果服务器再次启动并重新建立连接,我怎么知道? 我看不到任何可以提供此类信息的侦听器。 问题答案: 啊…旧的异常处理/重新连接难题。 有些传输提供程序将为您自动重新连接您的应用程序,而另一些传输提供
我编写了以下代码来检测目录是否存在。方法接受完全限定路径或相对路径。 注意:返回指定目录或文件名的完全限定路径。在我的例子中,这是。 这个代码已经运行了好几个月了。但它突然停止了工作。现在,当目录不存在时,中不会出现异常只返回一个空字符串。 我发布了一个类似的问题,有人建议我应该总是在路径的末尾追加。我试过了,以为我有一次例外,但现在没有例外。 我不知道与我通信的FTP服务器上的行为是否发生了变化
问题内容: 我知道这与这个问题相似,但是我在C#中将SQL Server CE 3.5与WinForms项目一起使用。如何确定表是否存在?我知道虽然不支持该关键字。CE中是否存在information_schema,可以在其中查询它?谢谢。 问题答案: 是的,它确实存在:
问题内容: 用Java实现此的最佳方法是什么?显然,泛型和通配符是为了能够轻松处理此类问题,但我正全神贯注。 如果有一个类似的方法来检查列表是否是相反的顺序,那也很好。 问题答案: Guava 通过其出色的Ordering类提供了此功能。An 是。在这种情况下,如果你具有实现的某种类型的列表,则可以编写: 这适用于任何,而不仅仅是,你可以通过指定s应该在其他任何非元素之前还是之后轻松地处理s :