带参数的SelectCommand提供空结果

时间:2011-10-27 13:29:19

标签: c# parameters selectcommand

目前我会稍微清理我的代码,VS告诉我,最好使用SqlParameter代替sql命令而不是化合物string。 所以我决定改变我的代码,不幸的是现在我没有得到结果,我不知道为什么。 这是我的代码:

...    
DataTable dt = new DataTable();
SqlConnection connection = new SqlConnection(GetSQLConnectionString());
SqlDataAdapter sqlSelect = new SqlDataAdapter();
try
{
    connection.Open();
    sqlSelect.SelectCommand = connection.CreateCommand();
    sqlSelect.SelectCommand.CommandText = "SELECT id, @FROM AS \"from\", @TO AS \"to\" FROM Dictionary WHERE @FROM LIKE @SEARCHSTRING";
    sqlSelect.SelectCommand.Parameters.Add(new SqlParameter("@FROM", this.from));
    sqlSelect.SelectCommand.Parameters.Add(new SqlParameter("@TO", this.to));
    sqlSelect.SelectCommand.Parameters.Add(new SqlParameter("@SEARCHSTRING", "'%" + this.SearchField.Text + "%'"));

    sqlSelect.Fill(dt);
    connection.Close();
}
catch(SqlException e)
...

我没有任何例外。搜索后为什么dt为空? (使用复合字符串,选择有效。)出了什么问题?

格尔茨

3 个答案:

答案 0 :(得分:2)

您无法使用此类参数指定字段名称。在where子句WHERE @FROM LIKE @SEARCHSTRING中,它将参数@FROM的值与参数@SEARCHSTRING的值进行比较。

如果where子句的计算结果为true,您将获得字典表中的每条记录,如果它的计算结果为false,则不会得到任何记录。它绝不会将@from的内容视为字典表中的字段名称。

答案 1 :(得分:1)

正如人们在此所说的那样,问题在于您无法将字段名称作为参数传递。

您正在采取的方法是一个坏主意,原因有两个:首先,当您以这种方式传递sql命令时,服务器必须在每次执行该查询时重新编译它,这会给服务器带来额外负载并减慢速度降低性能。其次,安全传输您的选择语句是一种风险,因为它会让截取它的任何人查看您的表结构。第三,使用像这样的select语句意味着如果你想重复使用你不能复制粘贴的代码。

我建议切换到存储过程。您仍然可以传递您的参数等,但它会改进您的代码,因为它将SQL从c#中取出并仅留下相关内容。

如果你真的需要传入要在这样的select语句中使用的字段名,你可以在SQL中执行此操作并构建查询字符串,然后使用sp_executesql执行它。

基本上你所做的是声明一个像

这样的查询字符串
DECLARE @queryString VARCHAR(3000)

SET @queryString ='SELECT id, '+@FROM+' AS from, '+@TO+' AS to FROM Dictionary WHERE +'@FROM+' LIKE %'+@SEARCHSTRING+'%'

然后只需使用sp_executesql来执行@queryString

如果在构建查询字符串时出现任何错误,您可能需要将参数转换为Varchar

答案 2 :(得分:0)

为什么你有这样的书面查询?

   "SELECT id, @FROM AS \"from\", @TO AS \"to\" FROM Dictionary WHERE @FROM LIKE @SEARCHSTRING";

你试图从表中获取@FROM并尝试将其作为参数传递,这应该有效吗?还有为什么你加入斜杠?他们只是让事情变得混乱,删除它们。 Select查询仅使用“WHERE”子句而不是其他地方获取输入参数。

尝试用此

替换它
"SELECT id, FROM AS 'from', TO AS 'to' FROM Dictionary WHERE FROM LIKE @SEARCHSTRING";

同时删除除最后一次出现的所有内容:

sqlSelect.SelectCommand.Parameters.Add

还要注意“FROM”也是一个SQL关键字,因此请确保通过将其括在“[]”中来正确解释它。

希望这会有所帮助......