【发布时间】:2013-03-23 03:20:49
【问题描述】:
这段代码:
public bool IsValidColumn(string tableName, string columnName)
{
//return true;// <-- when I uncomment this, I don't get the err msg (but I don't know whether it's a valid column or not, either)
bool validColumn = false;
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();
int i = 0;
object obj = cmd.ExecuteScalar();
if ((obj != null) && (obj != DBNull.Value))
{
i = Int32.Parse(obj.ToString());
validColumn = i > 0;
}
else
{
MessageBox.Show("NULL returned from ExecuteScalar. Remove this line.");
}
}
catch (SqlCeException sqlceex)
{
return false;
}
catch (Exception ex)
{
return false;
}
return validColumn;
}
...改编自/基于此处较早的答案:How can I determine whether a column exists in a SQL Server CE table with C#?
然而,它导致我得到,“解析查询时出错。[令牌行号,令牌行偏移,,令牌错误,,]”(我在这里抱怨:Why is there an err parsing this DDL, and why can't the engine be more specific about locating it? 和这里:
SQL Server CE's DDL parser is very picky but secretive about what it is finding fault with)。
在我试图找出导致这个错误消息的原因时,我实际上已经相当多地重构了遗留代码(从冰箱里扔了很多腐臭的意大利面),所以它不是浪费时间,但现在我发现导致错误消息的原因是上面代码中的内容。所以问题是:如何在不生成此错误消息的情况下确定列是否有效?
【问题讨论】:
-
直接对数据库运行 tje 查询是否有效?
-
我不知道 - 我无法通过这种方式直接访问数据库(过时的工具、靠我的裤子进行编码/调试)。
-
这似乎是您遇到错误的原因,但对我来说这似乎是错误的:
colNameParam.Value = tableName;。 -
为什么 .Execute 行被注释掉了..?我也强烈建议使用 Parameters.AddWithValue 方法..让数据库处理数据类型..您当前的代码
Clay需要一些认真的重构.. -
@DJ KRAZE:如果您对 this 代码有这样的想法,那么您应该看看其余部分。几周前,我真的觉得我被逼疯了,一整天都在摸索这些东西。诚然,这将是一个短暂的旅程,但仍然 - 失去你的精神错乱来编写一些不知名的猫写的代码超出了职责范围。
标签: c# sql compact-framework sql-server-ce .net-1.0