此代码:
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)。
在我试图找到造成这个错误消息的底部的时候,我实际上已经重构了相当多的遗留代码(从冰箱里扔了很多腐臭的意大利面),所以它不是浪费时间,但现在我发现造成错误消息的原因是上面代码中的内容。所以问题是:如何我确定列是否有效而不生成此错误信息?
答案 0 :(得分:1)
从您的评论中,我看到了这样的信息:
SQL Server CE不支持并行事务。
我猜你的代码在你进入交易时正在调用这个检查。您可能需要与事务分开进行错误检查。
我使用了一段时间的交易,然后意识到他们并不真正需要对数据库进行简单的读/写操作......因为我没有与银行机构打交道。我敢打赌,删除你的交易声明是安全的,但这只是附带意见。
我注意到你的很多代码都使用这些专门的语句:
checkConnection()
,objCon.CreateCommand()
和isValidField
。这些真的对你有帮助吗?
你称这些例程有多少个地方?
在您调用IsValidColumn
之前,错误消息使您听起来已经在代码中的其他位置启动了另一个事务。
也许您可以修改代码以尽早检查IsValidColumn
(例如程序启动时),以便在开始交易之前您已经知道该列有效。