【问题标题】:C# SqlDataAdapter SelectCommand: pass in parameter into TSQL 'execute'C# SqlDataAdapter SelectCommand:将参数传入 TSQL 'execute'
【发布时间】:2021-01-30 22:50:43
【问题描述】:

使用 C#,我想运行基于 SQL Server 版本的 SQL 命令(商业智能)。 所以命令类似于

if newVersion
    SELECT some cool stuff
else
    SELECT some old stuff

由于新版本包含旧 SQL Server 版本中不可用的功能,我发现这样做的唯一方法是通过 TSQL 中的执行函数

if newVersion
    execute('new SELECT')
else
    execute ('old SELECT')

到目前为止一切顺利。

我还想传入一个参数 - 实际上是一个 DateTime,它将成为 SELECT 的 WHERE 子句的一部分。

为了让事情变得更有趣,我将通过 SqlDataAdapter 从 C# 代码传递 DateTime @StartDate,该 SqlDataAdapter 将 .net 字符串语句作为 TSQL 文本传递到 SelectCommand 并调用 Fill。类似的东西

adapter.SelectCommand = new SqlCommand(statement, con);
adapter.SelectCommand.Parameters.Add(myStartDate);
adapter.Fill(ds, resultTableName);

但是.. 就我的一生而言,我无法让它进入 SQL 工作。在调用 Fill 方法(执行代码)时,我总是遇到一些语法错误异常。

传入参数(没有动态 SQL)以及将参数硬编码到动态 SQL 中都有效。但不是组合。

我的 SQL(仅用于测试)看起来像

EXECUTE('SELECT ''' + @MyStartDate + '''
')

我尝试将参数转换为要在服务器上执行的 SQL 命令文本的一部分。

我明白了

System.Data.SqlClient.SqlException: Incorrect syntax near SELECT

我想在通过execute命令执行的SQL查询中使用从C#添加的参数。

【问题讨论】:

  • 不要使用EXEC ({SQL Statement}) 你不能参数化语句。对sys.sp_executesql使用参数化调用。

标签: c# tsql sqldataadapter


【解决方案1】:

正如我在评论中所说,使用动态SQL时不要使用EXEC ({SQL Statement/Variable}),而是使用可以参数化的sys.sp_executesql

我们这里没有任何真实的示例代码,所以我将使用您过于简化的语句,即:

DECLARE @StartDate date = GETDATE();

DECLARE @SQL nvarchar(MAX) = N'SELECT @StartDate;';
EXEC sys.sp_executesql @SQL, N'@StartDate date', @StartDate = @StartDate;

【讨论】:

  • 我可能整天都在失败。非常感谢,它可以工作(使用演示,仍然需要编辑“真实”代码)。
猜你喜欢
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多