替代占位符后,我该如何查看发送到数据库的SQL语句?

3
下面的第一个MessageBox.Show()只是显示与const string SQL_GET_VENDOR_ITEMS完全相同的内容,这对我来说似乎很好,但是我得到了“解析查询时出错。[令牌行号,令牌行偏移量,错误中的令牌,]”的错误信息。
有没有一种方法可以在参数添加后窥视SQL的内容;它应该是这样的:"SELECT ItemID, PackSize FROM VendorItems WHERE VendorID = 'TEST' AND VendorItemID ='852963'"。
这是相关的代码:
    const string SQL_GET_VENDOR_ITEMS = "SELECT ItemID, PackSize " + 
        "FROM VendorItems " +
         "WHERE VendorID = @VendorID AND VendorItemID = @VendorItemID";

    string retVal = string.Empty;
    checkConnection();
    SqlCeCommand vendorCMD = objCon.CreateCommand();
    try 
    {
        vendorCMD.CommandText = SQL_GET_VENDOR_ITEMS;
        vendorCMD.Parameters.Add("@VendorID", SqlDbType.NVarChar, 10).Value = VendorID; 
        vendorCMD.Parameters.Add("@VendorItemID", SqlDbType.NVarChar, 19).Value = VendorItemID;

        MessageBox.Show(string.Format("Made it up to vendorCMD.ExecuteReader() with sql {0}", vendorCMD.CommandText));

. . .

        vendorReader.Close();
    } 
    catch (SqlCeException sqlceex)
    {
        MessageBox.Show(string.Format("SqlCeException in GetValsForVendorAndItem == {0}", sqlceex.Message));//TODO: Remove
    }
    finally 
    {
        vendorCMD.Dispose();
    }
    return retVal;

. . .


SQL Server CE不支持参数或者什么吗?参数的整个意义在于它们不会被替换。唯一需要“替换占位符”的原因是如果数据库不支持参数。VendorIDVendorItemID是否为null的可能性有多大? - Marc Gravell
我的意思是,带有“@VendorID”的查询字符串需要用某个值(例如“TEST”)替换,因为任何行中都没有“@VendorID”值。我只是想验证我期望的值是否被替换,以尝试弄清楚查询可能难以解析的原因 - 对我来说看起来非常简单,我不知道查询解析器为什么会卡在它上面。 - B. Clay Shannon-B. Crow Raven
不,它不需要被替换(至少在大多数数据库引擎上); 参数是单独发送到命令文本。现在CE可能会以不同的方式处理,因此我有一个问题。你看到关于“null”的编辑了吗? - Marc Gravell
2个回答

4

但我几乎可以保证,在我的VS2003/.NET 1.0世界中,那不会起作用。

啊...版本问题 - 参见MSDN

当CommandType设置为Text时,SQL Server CE的.NET Compact Framework数据提供程序不支持使用命名参数传递参数来调用SqlCeCommand执行的SQL语句。你必须使用问号(?)占位符。例如:SELECT * FROM Customers WHERE CustomerID = ?


1
完全的废话!谢谢!这个项目肯定可以治愈那些充满湿润眼泪的怀旧色调。 - B. Clay Shannon-B. Crow Raven
天哪!我一直在教他如何使用参数!哎呀! - user153923
1
哈哈!欢迎回到90年代。 - ctacke

1

由于您使用的是CE,您的选项有限,但是有一些建议可以帮助您查看数据库:Sql CE的Profiler

如果您使用的是普通的SQL Server,您可以考虑使用SQL Profiler。您将能够看到针对数据库执行了哪些操作。


如果我生活在21世纪,那么也许可以,但我几乎可以保证,在我的VS2003/.NET 1.0世界中不起作用。 - B. Clay Shannon-B. Crow Raven
@ClayShannon,这是关于数据库方面的问题,而不是关于VS的。 - rs.
没错,但我甚至无法访问数据库——我无法查看它,没有办法这样做(我的意思是,用外部工具)。相信我,我已经尝试过了。 - B. Clay Shannon-B. Crow Raven
没错,但这并不意味着他自己在手持设备上开发。"开发CE程序并不需要移动设备" - http://en.wikipedia.org/wiki/Windows_CE。我认为他是在本地机器上进行开发。 - wilsjd
明白了,在那种情况下这样做很有道理。 - wilsjd
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接