【问题标题】:Why is this function failing with "There was an error parsing the query. [Token line number, Token line offset,, Token in error,,]"?为什么此函数失败并显示“解析查询时出错。[令牌行号,令牌行偏移量,,令牌错误,,]”?
【发布时间】: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


【解决方案1】:

从您的 cmets 中,我看到了这条消息:

SQL Server CE 不支持并行事务。

我猜您的代码会在您进行交易时调用此检查。您可能需要与交易分开进行错误检查。

我使用了一段时间的事务,然后意识到它们并不是真正需要对数据库进行简单的读/写操作......因为我没有与银行机构打交道。我敢打赌,删除您的交易报表是安全的,但这只是侧面 cmets。

我注意到你的很多代码都使用了这些专门的语句:

  • checkConnection(),
  • objCon.CreateCommand()
  • isValidField

这些真的对你有帮助吗?

你在多少地方调用了这些例程?

错误消息听起来好像您在调用 IsValidColumn 之前已经在代码中的其他地方启动了另一个事务。

也许您可以修改代码以尽早检查IsValidColumn(例如在程序启动时),以便在开始交易之前就已经知道该列是有效的。

【讨论】:

  • 不,这些代码都没有帮助我;这是一车垃圾的腐臭意大利面,我睁大眼睛颤抖着。我只想冲进这个恐怖的大厅,抓起东西,跑出去,砰的一声关上门,希望永远不会回来。如果您在字典中查找“whack-a-mole”,它会将您引向这个项目。这段代码最需要的是驱魔人。
  • 不过,你肯定有一群不喜欢你的人!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多