【问题标题】:Invalid character value for cast specification vb.net MS Access to SQL Server import转换规范 vb.net MS Access 到 SQL Server 导入的字符值无效
【发布时间】:2016-08-03 14:51:49
【问题描述】:

我的程序中有以下 INSERT 查询(变量从 Access 数据库中分配了一个值,并被插入到新的 SQL Server 数据库中)。代码运行良好,Parameters.Add 部分中的值都是它们应该的值,但是当它到达sql.ExecuteNonQuery() 行时,我得到了错误

转换规范的字符值无效。 在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior 行为,字符串方法) 在 System.Data.OleDb.OleDbCommand.ExecuteNonQuery()

        For Each dr As DataRow In getDataTable(sqlct, importsCon, Nothing).Rows

            Dim conID As Integer
            Dim custacc As String
            Dim datestart As Object
            Dim daterenew As Object
            Dim fee As Double
            Dim agree As String
            Dim details As String
            Dim datesent As Object
            Dim timesent As Object
            Dim remname As String
            Dim remmail As String

            conID = dr("ContractID")
            custacc = dbToString(dr("CustAcc"))
            datestart = dbToDate(dr("DateStart"))
            daterenew = dbToDate(dr("DateRenew"))
            fee = dr("Fee")
            agree = dbToString(dr("Agreement"))
            details = dbToString(dr("OtherDetails"))
            datesent = dbToDate(dr("DateSent"))
            timesent = dbToTime(dr("TimeSent"))
            remname = dbToString(dr("ReminderName"))
            remmail = dbToString(dr("ReminderEmail"))

            sql.CommandText = "INSERT INTO tblContracts(ContractID, CustAcc, DateStart, DateRenew, Fee, Agreement, OtherDetails, DateSent, TimeSent, ReminderName, ReminderEmail) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
            sql.Transaction = tr
            sql.Parameters.Clear()
            sql.Parameters.Add("@ContractID", OleDbType.Integer).Value = conID
            sql.Parameters.Add("@CustAcc", OleDbType.VarChar).Value = custacc
            sql.Parameters.Add("@DateStart", OleDbType.DBDate).Value = datestart
            sql.Parameters.Add("@DateRenew", OleDbType.DBDate).Value = daterenew
            sql.Parameters.Add("@Fee", OleDbType.Double).Value = fee
            sql.Parameters.Add("@Agreement", OleDbType.VarChar).Value = agree
            sql.Parameters.Add("@OtherDetails", OleDbType.VarChar).Value = details
            sql.Parameters.Add("@DateSent", OleDbType.DBDate).Value = datesent
            sql.Parameters.Add("@TimeSent", OleDbType.DBDate).Value = timesent
            sql.Parameters.Add("@ReminderName", OleDbType.VarChar).Value = remname
            sql.Parameters.Add("@ReminderEmail", OleDbType.VarChar).Value = remmail

            sql.ExecuteNonQuery()
            sql.Parameters.Clear()

        Next

我的代码有什么问题?所有数据类型都与数据库的数据类型匹配(对象是数据库中的日期时间,但它们最初是对象,因为它们首先通过另一个函数)

【问题讨论】:

  • @GordThompson 我将所有的OleDbType.VarChar 更改为OleDbType.VarWChar,出现同样的错误信息
  • 在 INSERT 查询中,首先执行 sql.CommandText = "INSERT INTO tblContracts(ContractID) VALUES(?),然后注释除 conID 之外的所有参数行。测试程序。如果可行,请在 (CustAcc) 中添加另一个,然后重复该过程,直到找到破坏它的那个,以帮助缩小问题范围
  • @David 谢谢,所以错误是sql.Parameters.Add("@DateSent", OleDbType.DBDate).Value = datesent
  • 好的,很好,所以你知道它所在的行...告诉我,查询试图插入导致错误的值是什么?
  • @David 值是 12:00:00 AM,它被转换成这个是因为它在数据库中是一个空值

标签: vb.net sql-server-2008 tsql ms-access insert


【解决方案1】:

在cmets中发现,问题出在sql.Parameters.Add("@DateSent", OleDbType.DBDate).Value = datesent线上

由于您要导入的数据库在一个或多个记录的此字段中存储了一个空值,在检查它是否为空的函数中,它正在从空转换为12:00:00 AM(此代码未给出在问题中,所以我不确定为什么或如何。

现在,您不能将 12:00:00 AM 插入为 DBDate 值,因为它需要一个日期格式值(yyyyMMdd 或类似)。

解决这个问题的方法就是简单的把前面提到的那行改成

sql.Parameters.Add("@DateSent", OleDbType.Date).Value = datesent

使用OleDbType.Date 不会插入该值,即使没有指定日期,因为它可以使用它,并为此方法插入一个默认日期,我相信它是1899-12-30。但无论哪种方式,这都会解决你的问题

【讨论】:

  • 谢谢大卫,这已经解决了!我将它们全部更改为 Date 只是为了避免进一步的麻烦 :)
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多