[英]How can I determine whether a column exists in a SQL Server CE table with C#?
The legacy code does it this way: 遗留代码以这种方式执行:
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;
}
...but I find it doesn't always work. ...但我发现它并不总是有效。 After calling that method, and getting
false
, some code ALTERS the table to add some columns, but I'm getting: 在调用该方法并获得
false
,一些代码会在表中添加一些列,但是我得到了:
A column ID occurred more than once in the specification.
列ID在规范中出现多次。
I found here on StackOverflow a couple of promising SQL statements: 我在StackOverflow上找到了几个有前途的SQL语句:
if exists(select * from sys.columns
where Name = N'columnName' and Object_ID = Object_ID(N'tableName'))
and 和
IF COL_LENGTH('table_name','column_name') IS NULL
...but am not sure how to implement this in C# / .NET 1.1 ...但我不确定如何在C#/ .NET 1.1中实现它
Do I need to use ExecuteScalar and cast the returned value to a bool? 我是否需要使用ExecuteScalar并将返回的值转换为bool? Or something else?
或者是其他东西?
Changing it to this didn't rectify matters: 改变它并没有纠正问题:
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;
}
Oddly enough, I see even more of those error messages with the new code. 奇怪的是,我用新代码看到了更多这些错误消息。
It made no difference when I altered the code this way: 当我以这种方式更改代码时没有任何区别:
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;
}
...so I don't know which way is preferable; ......所以我不知道哪种方式更可取; this does seem more straightforward to me...any thoughts, anyone?
这对我来说似乎更直接......任何想法,任何人?
You can just query the information schema tables to get the information you want: 您只需查询信息架构表即可获得所需信息:
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;
}
public bool IsValidField(SqlCeConnection objCon, string tableName, string columnName)
{
const string query = "SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS"
+ " WHERE TABLE_NAME = @TABLENAME AND"
+ " COLUMN_NAME = @COLUMNNAME";
using (var cmd = new SqlCeCommand(query, objCon))
{
cmd.Parameters.Add("@TABLENAME", SqlDbType.NVarChar, 128).Value = tableName;
cmd.Parameters.Add("@COLUMNNAME", SqlDbType.NVarChar, 128).Value = columnName;
var objvalid = cmd.ExecuteScalar(); // will return 1 or null
return objvalid != null;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.