我有一个C#代码,它使用以下代码生成要执行的SQL查询:
strQuery = "select * from ";
strQuery += tableName + " where";
stryQuery += " columnName = " + columnValue; //where columnValue is a parameter (@XYZ)
此代码在VS 2005中运行正常。但是,在将解决方案升级到VS 2012后,第三行会导致问题。通常查询应该看起来像
select * from tableName where columnName = columnValue
但在VS 2012中,查询看起来像
select * from tableName where\tcolumnName = columnValue
我根本不知道它为什么会发生,如果是这样,为什么只有字符串连接中的前导空格。
编辑:更多详情:
在代码中,有一个名为CreateSQLQueryString的函数,其片段在上面。此函数使用@XYZ作为列值创建基本查询。然后将相同的内容传递给另一个名为CreateParameterArray的函数,该函数为所有此类@XYZ值创建一个参数数组。然后使用基本字符串和参数数组来执行查询。
现在,我检查了CreateParameterArray函数接收到的字符串,并且接收到带有制表符的字符串。因此,没有其他功能导致问题。正是这种字符串连接导致了麻烦。
编辑:
void GetRows(connectionID)
{
string strQuery;
strQuery = "select ";
if (condition1)
strQuery += " PartName,";
if (condition2)
strQuery += " PartPrice,";
...
if (condition10)
strQuery += " PartQuantity";
strQuery += " where "
if (whereclause1)
strQuery += " partName= '" + partname + "'"; //partname = "@PartName"
if (whereclause2)
strQuery += " partPrice= '" + partPrice + "'";
...
Var ParamArray[] = CreateParameterArray(strQuery);
/// code to create connection object based on current server info
//execute query
var resultSet = connectionObject.ExecuteQuery ( strQuery, ParamArray[], connectionID);
//display result
UpdateDisplay(resultSet);
}
CreateParameterArray(string query)
{
//code to add a value in parameter array for every reference of "@" in query.
}
这是代码的基本思想。我已经用通用名称替换了列名。
最终编辑:
事实证明,升级期间还添加了另一个isPostBack条件。不知道如何或为什么。但删除后,一切正常。在页面初始化期间,在查询字符串上调用了一个trim函数,该函数已移至isPostBack条件。现在正确调用trim函数,查询工作正常。仍然不知道,为什么空格被制表符替换,但谢天谢地用4个空格替换这些字符。系统现在工作正常,但我仍然对它是如何发生感到困惑。
答案 0 :(得分:1)
为什么不使用String.Format
?
String.Format("select * from {0} where columnName = {1}",tableName, columnValue);
答案 1 :(得分:0)
您是否检查过您的空白以确保升级没有将空格转换为标签?
您可以使用Ctrl + R,Ctrl + W查看空格。