2

目前我会稍微清理一下我的代码,VS 告诉我,最好使用SqlParameterfor 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 为空?(使用复合字符串,选择有效。)出了什么问题?

格雷茨

4

4 回答 4

2

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

如果 where 子句评估为 true,您将获得字典表中的每条记录,如果它评估为 false,您将不会获得任何记录。它永远不会将@from 的内容视为字典表中的字段名称。

于 2011-10-27T13:43:58.740 回答
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

于 2011-10-27T13:56:48.457 回答
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 关键字,因此请确保通过将其括在“[]”中来正确解释它。

希望这可以帮助...

于 2011-10-27T13:44:10.633 回答
0

这:

sqlSelect.SelectCommand.Parameters.Add(new SqlParameter("@SEARCHSTRING", "'%" + this.SearchField.Text + "%'"));

应该是:

sqlSelect.SelectCommand.Parameters.Add(new SqlParameter("@SEARCHSTRING", "%" + this.SearchField.Text + "%"));
于 2022-03-03T15:58:37.350 回答