【问题标题】:SQL Insert fails via ADO.NetSQL 插入通过 ADO.Net 失败
【发布时间】:2016-01-03 22:02:12
【问题描述】:

我通过以下方式向 SQL Server 2008 R2 发送了一条 INSERT 语句:

Function ExecuteSQL(ByVal SQL As String, Optional ByVal UserConnectString As String = "", Optional ByVal MsgSuppress As Boolean = False) As Integer
    Dim cmd As New Data.SqlClient.SqlCommand 'text commands only'
    Dim sConStr As String = UserConnectString
    If sConStr.Length = 0 Then sConStr = g.OISConnectString
    Dim i As Integer
    Try
        Using con As New SqlConnection(sConStr)
            con.Open()
            cmd.CommandText = SQL
            cmd.Connection = con
            i = cmd.ExecuteNonQuery()
            Return i
            con.Close()
        End Using
    Catch ex As Exception
        If Not MsgSuppress Then
            ExpLog.LogMsgBox(ex, "Unexpected error:" & vbCrLf & ex.Message & vbCrLf & SQL & vbCrLf & "Notify Programmers", , , "SQL: " & SQL)
        End If
        Return -1 'count'
    End Try
End Function

SQL:

INSERT INTO MAF01_CA
SELECT TransId, TransDateStamp, LocalTransDateStamp, L2GMerchantCode, PayMethodCode, TotTransAmt, TotFeeAmt, TotMerchantAmt, AcctNbrLast5, AcctNbrData, UserPart1, UserPart2, UserPart3, UserPart4, UserPart5, UserPart6, AcctHolderName, BillingAddress, BillingCity, BillingState, BillingZip, BillingEmail, BillingPhone, AuthCode, LineItem, LineItemUserPart1, LineItemUserPart2, LineItemUserPart3, MerchantAmt, AcctNbrPrefix, AcctNbr, Clerk, Terminal, UserDefinedConstant, IsRefund, BatchOutId, BatchStatusCode, SettleMerchantCode, BatchDate, BatchTotAmt, BatchTransCnt, BatchAdjustAmt, BatchAdjustCnt, OrigTransID, Status, Comment, Last_Update_Date, TransIDEx
FROM   MAF01
WHERE  (TransId LIKE '3653511561%')

当通过 ADO.Net SqlClient 发送时,i = cmd.ExecuteNonQuery() 上的 SQL 语句失败,Conversion failed when converting character string to smalldatetime data type.。但在 SQL Server Management Studio 查询工具中工作得很好。

什么可能导致这个错误?

请 - 没有关于注入问题的 cmets。


从表:

CREATE TABLE [dbo].[MAF01_CA](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [TransId] [bigint] NULL,
    [TransDateStamp] [smalldatetime] NULL,
    [LocalTransDateStamp] [smalldatetime] NULL,
...
    [BatchDate] [smalldatetime] NULL,
...
    [Last_Update_Date] [smalldatetime] NULL CONSTRAINT [DF_MAF01_CA_Last_Update_Date]  DEFAULT (getdate()),

到表:

CREATE TABLE [dbo].[MAF01](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [TransId] [bigint] NULL,
    [TransDateStamp] [smalldatetime] NULL,
    [LocalTransDateStamp] [smalldatetime] NULL,
...
    [BatchDate] [smalldatetime] NULL,
...
    [Last_Update_Date] [smalldatetime] NULL CONSTRAINT [DF_MAF01_Last_Update_Date]  DEFAULT (getdate()),

【问题讨论】:

  • 这是一个数据问题。您正在从 MAF01 中的字符串字段插入 smalldatetime 字段(在 MAF01_CA 中),该字段不包含有效日期或日期格式不正确。
  • 这似乎合乎逻辑,但数据不在客户端上。 SQL SELECTs 从一个 DB..Table 和 INSERTs 到服务器上的另一个 DB.Table。 ADO.Net 永远无法访问数据。一个可能的错误是表格设计不匹配,但情况似乎并非如此。我已将所有日期字段的 DDL 添加到 OP。所有 smalldatetime 字段似乎都在源记录中正确填充。我猜还有什么问题,Conversion failed... 消息是假的。
  • 错误消息直接来自 SQL Server,如果您直接在 Query Analyser 中运行 sql,则可以看到该错误消息。如果您确定数据库表定义相同,那么我会说表列顺序与选择部分不匹配。
  • 我可以在 SQL 管理器中运行 INSERT SQL 的副本,但没有出现错误。该副本是在代码中设置后从.CommandText 中提取的。我的ExecuteSQL() 在很多地方都被使用并且工作正常——我的调试非常愚蠢或一个非常奇怪的错误。一个真正的难题是相同的(希望是)SQL 在一种情况下可以工作,而在另一种情况下不能工作。
  • 听起来很奇怪。我只能建议一次删除几列以查明有问题的列。

标签: vb.net sql-server-2008-r2 .net-4.0 ado.net


【解决方案1】:

我完全定义了要更新的字段,它在 ADO.Net 中工作。

INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;

我猜奇怪的是第一个模式完全有效。

INSERT INTO table2
SELECT column_name(s)
FROM table1; -- fails via ADO.Net

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多