C#SqlDataAdapter SelectCommand:将参数传递到TSQL'execute'

问题描述

从C#开始,我想基于sql Server版本运行sql命令(商业智能)。 所以命令就像

if newVersion
    SELECT some cool stuff
else
    SELECT some old stuff

由于新版本包含旧sql Server版本中不提供的功能,所以我发现这样做的唯一方法是通过Tsql中的execute函数

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#添加的参数。

解决方法

正如我在评论中所说,在使用动态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;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...