动态 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)
);
我正在使用 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)
);