动态 SQL 问题(另外:如何从 ExecuteNonQuery 获取 SQL 行)

Issue with Dynamic SQL (Also: How to get SQL Lines from ExecuteNonQuery)

我正在使用 Visual Studio,我正在尝试使用 C# 和 Dynamic SQL 创建插入语句。

SQL 命令:

comando.CommandText = @"
                      declare @sql nvarchar(max);                                                               
                      set @sql = 'INSERT INTO ' + @curso + '(Data_Local, Deletado) VALUES ( ' + @date + ', 0)';
                      exec (@sql);                                  
                      ";  

@curso 是 Table 名称,它正在工作,Data_Local 是一个日期时间值,它不起作用,而 Deletado 是一个位值,它正在工作。

声明@curso:

comando.Parameters.Add("@curso", SqlDbType.NVarChar);
            comando.Parameters["@curso"].Value = idCurso;

声明@date

comando.Parameters.Add("@date", SqlDbType.DateTime);
            comando.Parameters["@date"].Value = dateTimePicker2.Value.Date;

之后:

comando.ExecuteNonQuery();

出现错误信息:

'Conversion failed when converting date and/or time from character string.'

我应该怎么做才能从 DateTimePicker 中读取值,插入到@date 变量中,并将其正确添加到 SQL 命令中?

另外,我还有一个疑惑,哪里可以看到SQL命令是怎么发送的?我需要查看这些行的真实情况,没有变量的 SQL 命令如何,而是使用值。

抱歉,如果我的问题没有得到很好的解释,我会继续努力说清楚。

编辑:

我试过了:

comando.CommandText = @"
                      declare @sql nvarchar(max);                                                               
                      set @sql = 'INSERT INTO ' + @curso + '(Data_Local, Deletado) VALUES ( ' + @date + ', 0)';
                      exec (@sql);                                  
                      ";  

comando.Parameters.Add("@date", SqlDbType.NVarChar);
            comando.Parameters["@date"].Value = "'" + dateTimePicker2.Value.Date + "'";  

新错误信息:

'The conversion of a varchar data type to a datetime data type resulted in an out-of-range value. The statement has been terminated.'

编辑。谢谢,解决了。

宁可使用存储过程,如果要在 C# 应用程序中使用动态 SQL,那就太糟糕了。首先因为作为 DBA,像这样的 Adhoc 查询很难维护,其次它更容易管理,也更容易应用到代码中。

1) 创建存储过程

CREATE PROCEDURE Insert_Test
(
    @curso VARCHAR(256),
    @date VARCHAR(32)
)

AS

SET NOCOUNT ON

DECLARE @sql NVARCHAR(MAX)

IF ISDATE(@date) = 1 --check if its the correct date
BEGIN

    SET @sql = 'INSERT INTO ' + @curso + '(Data_Local, Deletado) VALUES ( ''' + @date + ''', 0)'

    EXEC (@sql)
END  

2) 在您的 C# 代码中

 string tbleName = "Test";
 DateTime dte = DateTime.Now.ToString(); 

 comando.ExecuteSqlCommand("exec Insert_Test @curso, @date", 
                                            new SqlParameter("curso", tbleName),
                                            new SqlParameter("date", dte)
                          );