【发布时间】: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