我有一个SQL存储过程,它使用openrowset命令从excel表中获取值并将其插入数据库。
我创建了一个C#应用程序,它将调用该过程并执行它。
问题!
当我从SQL管理工作室执行该过程时,没有错误。它发生得很完美。但是当我通过C#应用程序执行它时,我收到一个错误:"从字符串转换日期和/或时间时转换失败。"
代码
SQL查询(仅限插入部分)
insert into tbl_item ([Item code],[Dt Created])
select[Item code] ,
case when [Dt Created] is null or [Dt Created]='' then null when ISDATE(CONVERT(nvarchar,CONVERT(datetime, [Dt Created],103))) =1 then CONVERT(datetime, [Dt Created],103) else null end as [Dt Created]
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0; Database=C:\Upload\Report.xlsx;HDR=YES;IMEX=1;',
'select * from [Sheet1$]')
C#代码
public int updateItem()
{
SqlCommand cmd; cmd = new SqlCommand("usp_updateItem", conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int);
returnParameter.Direction = ParameterDirection.ReturnValue;
try
{
if (conn.State.Equals(ConnectionState.Closed))
conn.Open();
cmd.ExecuteNonQuery();
ret = Convert.ToInt32(returnParameter.Value);
}
catch (Exception e)
{
err = "Error: " + e.Message;
return -1;
}
finally
{
conn.Close();
}
return ret;
}
答案 0 :(得分:2)
您在[Dt Created]变量中使用的格式是什么。
您在案例中的转换语句只会转换以下类型
YYYY-MM-DD
YYYY-DD-MM
DD-MM-YYYY
您收到的错误是因为您的日期格式为" MM-DD-YYYY"类似于' 12-24-2015'。因此,您将收到转换错误。
答案 1 :(得分:1)
对不起我想阻止你到这里来。你的问题现在解决了,但无论如何 Karthik Venkatraman 曾说过是对的。不知何故,你得到了解决方案,但出于学习目的,我建议进行更多调查。这不属于你所说的任何东西但是确定这属于日期格式。
**
一招
创建一个DateTimeVariable,一旦初始化,然后根据数据库中存在的记录使用DateTimeParse类解析它。
我相信你会得到解决方案..谢谢:)
答案 2 :(得分:-1)
这就是我最终解决它的方法......
SQL错误消息'转换失败'绝对是一个错误的指针。它与手头的问题毫无关联。 [如果我之前只知道这个:(]
实际问题是我在上面发布的主要程序中调用了另一个程序。这个设置在SQL管理工作室中完美运行,它在我的凭据下运行。现在在C#应用程序中,我创建了另一个SQL登录用户ID来运行它。并且此用户标识没有执行子过程的执行权限。具有讽刺意味的是,SQL给了我一个误导性的转换错误。一旦我给予了正确的许可,它就完美无缺。