从C#执行时,SQL过程中的转换失败

时间:2015-11-18 06:09:45

标签: c# sql openrowset

我有一个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;
    }

3 个答案:

答案 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给了我一个误导性的转换错误。一旦我给予了正确的许可,它就完美无缺。