我想使用 .net/C# 开发 Web 应用程序。我有一个 SQL Server 存储过程,我想传递动态日期时间参数。
当我使用 exec(@sql)
时,这里是带有参数的存储过程:
Error:System.Data.SqlClient.SqlException:
Conversion failed when converting datetime from character string.
我什至尝试传递一些实际值(见下文)并尝试在 SQL Server 中进行调试,但它不起作用。
谁能帮帮我?非常感谢。
ALTER PROCEDURE [dbo].[production_tb_WorkshopDailyReports_INSERT]
@intDepartmentID int,
@intReportUserID int,
@intProductionLineID int,
@intBatchID int,
@intVINID int,
@columnname nvarchar(255),
@dtOnlineTime datetime,
@strRemark nvarchar(50),
@intCreateUserID int
AS
BEGIN
declare @column nvarchar(255)
declare @sql nvarchar(1000)
declare @intID int
set @columnname = 'dtOnlineTimeChassis'
set @column = @columnname
set @intDepartmentID = 1
set @intReportUserID = 1
set @intProductionLineID = 1
set @intBatchID = 1
set @intVINID = 1
set @dtOnlineTime = '2016-04-26 10:00:00pm'
set @strRemark = 'remark information'
set @intCreateUserID = 1
set @sql = 'Insert Into production_tb_WorkshopDailyReports (intDepartmentID, intReportUserID, intProductionLineID, intBatchID, intVINID,' + @column + ', strRemark, intCreateUserID) values ' + '(' + cast(@intDepartmentID as nvarchar(20)) + ',' + cast(@intReportUserID as nvarchar(20)) + ',' + cast(@intProductionLineID as nvarchar(20)) + ',' + cast(@intBatchID as nvarchar(20)) + ',' + cast(@intVINID as nvarchar(20)) + ',' + @dtOnlineTime + ',' + @strRemark + ',' + cast(@intCreateUserID as nvarchar(20)) + ')'
(@intReportUserID as nvarchar(20))+','+cast(@intProductionLineID as nvarchar(20))+','+cast(@intBatchID as nvarchar(20))+','+cast(@intVINID as nvarchar(20))+','+''+','+cast(@intCreateUserID as nvarchar(20))+')'
exec(@sql)
End
最佳答案
我猜这一切:
set @columnname = 'dtOnlineTimeChassis'
set @column = @columnname
set @intDepartmentID = 1
set @intReportUserID = 1
set @intProductionLineID = 1
set @intBatchID = 1
set @intVINID = 1
set @dtOnlineTime = '2016-04-26 10:00:00pm'
set @strRemark = 'remark information'
set @intCreateUserID = 1
只是为了测试 SP,其他时候 @columnname
变量会有一些不同。如果此声明为假,那么我建议使用简单的 INSERT
而不是动态 SQL。
首先改变这个:
',' + @dtOnlineTime + ',' + @strRemark + ','
对此:
',''' + CONVERT(nvarchar(50),@dtOnlineTime,120)+''',''' + @strRemark + ''','
我建议使用 120
日期样式(ODBC 规范 yyyy-mm-dd hh:mi:ss(24h)
,有关更多信息,请阅读 MSDN)和您必须将日期时间变量和带有注释的变量放入''
。
其次删除或注释这部分(set @sql = ...
之后的下一个字符串):
(@intReportUserID as nvarchar(20))+','+cast(@intProductionLineID as nvarchar(20))+','+cast(@intBatchID as nvarchar(20))+','+cast(@intVINID as nvarchar(20))+','+''+','+cast(@intCreateUserID as nvarchar(20))+')'
PRINT
查询后,您将看到如下内容:
Insert Into production_tb_WorkshopDailyReports (intDepartmentID, intReportUserID, intProductionLineID, intBatchID, intVINID,dtOnlineTimeChassis, strRemark, intCreateUserID) values
(1,1,1,1,1,'2016-04-26 22:00:00','remark information',1)
尝试执行它。
关于c# - 当列为日期时间类型时,SQL Server 列作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37041948/