首页 > 解决方案 > 动态 SQL 的问题(另:如何从 ExecuteNonQuery 获取 SQL 行)

问题描述

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

SQL 命令:

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

@curso 是表名,它正在工作,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();

出现错误信息:

'从字符串转换日期和/或时间时转换失败。'

我应该怎么做才能从 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 + "'";  

新的错误信息:

'将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。该语句已终止。'

编辑。谢谢,解决了。

标签: sql-servervisual-studiotsqldynamic-sql

解决方案


而是使用存储过程,如果你要在你的 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)
                          );

推荐阅读