sql-server - 动态 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 数据类型导致值超出范围。该语句已终止。'
编辑。谢谢,解决了。
解决方案
而是使用存储过程,如果你要在你的 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)
);
推荐阅读
- c# - Blazor RadzenDataGrid 显示对象名称,而不是值
- python - “这个插件不支持propagateSizeHints()”/在QDialog子类上调用`exec`
- ios - UISplitViewController PrimaryViewController 视图框架的值错误
- python - 将 IdentityServer4 作为 OAuth2 服务器添加到 Django API
- spring-boot - 我的控制器方法它正在加载数据并导出到另一个源,在这里我想让这个异步
- google-chrome - 如何在 chrome 中单击并选择使用 selenium 和 python 下载音频文件以获取此特定链接
- sql - 是否可以使用一个 SQL 来获得带有自定义列的自定义数据
- javascript - 如何将数据从组件传递到 getServerSideProps
- javascript - 从异步函数获取返回数据
- ruby-on-rails - 电子邮件 CSS 未在生产中应用。在 Heroku 上使用 TailwindCSS 的 Premailer-rails