Sql server 写入SQL时遇到问题
我已经在VB.Net中写了几个月了,在我的代码中多次成功地使用SQL命令,但在写入数据库中的一个特定表时遇到了问题。我相信问题在于我有一个数字列,我正试图写入它(我得出这个结论是因为它是我唯一不经常使用的列),我的代码不断出现一个异常:附加信息:SqlCommand.Prepare方法要求所有可变长度参数都显式设置为非零大小。使用代码:Sql server 写入SQL时遇到问题,sql-server,vb.net,Sql Server,Vb.net,我已经在VB.Net中写了几个月了,在我的代码中多次成功地使用SQL命令,但在写入数据库中的一个特定表时遇到了问题。我相信问题在于我有一个数字列,我正试图写入它(我得出这个结论是因为它是我唯一不经常使用的列),我的代码不断出现一个异常:附加信息:SqlCommand.Prepare方法要求所有可变长度参数都显式设置为非零大小。使用代码: Dim cn As System.Data.SqlClient.SqlConnection Dim command As System.Data
Dim cn As System.Data.SqlClient.SqlConnection
Dim command As System.Data.SqlClient.SqlCommand
Dim VL1 As System.Data.SqlClient.SqlParameter
Dim VL2 As System.Data.SqlClient.SqlParameter
Dim VL3 As System.Data.SqlClient.SqlParameter
Dim VL4 As System.Data.SqlClient.SqlParameter
Dim commandText As String
cn = New System.Data.SqlClient.SqlConnection(ConnectStr)
cn.Open()
commandText = "INSERT INTO [dbo].[HourMeterLog]" _
+ "([MachineName],[TotalHours],[HLRD],[DateTime])" _
+ "VALUES (@VL1,@VL2,@VL3,@VL4)"
command = New System.Data.SqlClient.SqlCommand(commandText, cn)
VL1 = command.Parameters.Add("@VL1", System.Data.SqlDbType.NVarChar, 25)
VL2 = command.Parameters.Add("@VL2", System.Data.SqlDbType.Float)
VL3 = command.Parameters.Add("@VL3", System.Data.SqlDbType.Int, 10)
VL4 = command.Parameters.Add("@VL4", System.Data.SqlDbType.DateTime2, 0)
command.Prepare()
VL1.Value = "MachineName"
VL2.Value = 0
VL3.Value = 735562
VL4.Value = Now()
command.ExecuteNonQuery()
cn.Close()
我知道我的代码可以连接,因为我至少有15个其他查询使用这种格式。我不希望使用float来写入数字字段,但我在第一次启动此代码时就让它工作了(从那时起就没有一次)。对于错误消息,我对您的表一无所知 “SqlCommand.Prepare方法要求所有可变长度参数具有显式设置的非零大小” 来自MSDN() 也许你的问题来自:
VL4 = command.Parameters.Add("@VL4", System.Data.SqlDbType.DateTime2, 0)
换成
VL4 = command.Parameters.Add("@VL4", System.Data.SqlDbType.DateTime2)
根据DateTime2
的最大字符长度为27。因此,我将DateTime2
的长度设置为27,并且工作正常
VL4 = command.Parameters.Add("@VL4", System.Data.SqlDbType.DateTime2, 27)
我的工作代码是
Dim cn As System.Data.SqlClient.SqlConnection
Dim command As System.Data.SqlClient.SqlCommand
Dim VL1 As System.Data.SqlClient.SqlParameter
Dim VL2 As System.Data.SqlClient.SqlParameter
Dim VL3 As System.Data.SqlClient.SqlParameter
Dim VL4 As System.Data.SqlClient.SqlParameter
Dim commandText As String
cn = New System.Data.SqlClient.SqlConnection(connectionString)
cn.Open()
commandText = "INSERT INTO [dbo].[HourMeterLog]" _
+ "([MachineName],[TotalHours],[HLRD],[DateTime])" _
+ "VALUES (@VL1,@VL2,@VL3,@VL4)"
command = New System.Data.SqlClient.SqlCommand(commandText, cn)
VL1 = command.Parameters.Add("@VL1", System.Data.SqlDbType.NVarChar, 25)
VL2 = command.Parameters.Add("@VL2", System.Data.SqlDbType.Float)
VL3 = command.Parameters.Add("@VL3", System.Data.SqlDbType.Int, 10)
VL4 = command.Parameters.Add("@VL4", System.Data.SqlDbType.DateTime2, 27)
command.Prepare()
VL1.Value = "MachineName"
VL2.Value = 0
VL3.Value = 735562
VL4.Value = Now()
command.ExecuteNonQuery()
cn.Close()
好吧,我想我试着用AddWithValue方法的时候写错了。我得到了写的命令:
Dim cn As System.Data.SqlClient.SqlConnection
Dim command As System.Data.SqlClient.SqlCommand
Dim VL1 As System.Data.SqlClient.SqlParameter
Dim VL2 As System.Data.SqlClient.SqlParameter
Dim VL3 As System.Data.SqlClient.SqlParameter
Dim VL4 As System.Data.SqlClient.SqlParameter
Dim commandText As String
cn = New System.Data.SqlClient.SqlConnection(ConnectStr)
cn.Open()
commandText = "INSERT INTO [dbo].[HourMeterLog]" _
+ "([MachineName],[TotalHours],[HLRD],[DateTime])" _
+ "VALUES (@VL1,@VL2,@VL3,@VL4)"
command = New System.Data.SqlClient.SqlCommand(commandText, cn)
VL1 = command.Parameters.AddWithValue("@VL1", "MachineName")
VL2 = command.Parameters.AddWithValue("@VL2", 0)
VL3 = command.Parameters.AddWithValue("@VL3", 735562)
VL4 = command.Parameters.AddWithValue("@VL4", Now())
'VL1 = command.Parameters.Add("@VL1", System.Data.SqlDbType.NVarChar, 25)
'VL2 = command.Parameters.Add("@VL2", System.Data.SqlDbType.Float)
'VL3 = command.Parameters.Add("@VL3", System.Data.SqlDbType.Int)
'VL4 = command.Parameters.Add("@VL4", System.Data.SqlDbType.DateTime2)
'command.Prepare()
'VL1.Value = "MachineName"
'VL2.Value = 0
'VL3.Value = 735562
'VL4.Value = Now()
command.ExecuteNonQuery()
cn.Close()
我真的更愿意使用我以前使用过的格式,但我很高兴至少我现在正在写作。谢谢你们的帮助。如果有人对如何改进我的原始格式以使其正确书写有任何想法,请告诉我。对于那些想在表中获得一些信息的人,我也在写,浮点所写的字段是一个数字(18,1)字段。除了该列之外,其他的可以从代码中推断。对于那些想知道我为整个类声明了连接字符串的人,因为我只在这个程序中向一台服务器写入数据。它变暗:服务器=服务器;uid=用户;pwd=密码;database=example我已经有一段时间没有使用过很多SQL了,但我认为不需要提供Int或DateTime2参数的长度。试着找出长度,看看它是否有效?首先,我建议你在使用语句时确定你的连接范围等。第二,尝试对参数执行AddWithValue(),并删除prepare(至少现在是为了保持简单)。如果链接中的代码示例起作用,您就知道您的连接起作用了。最后添加一个try/catch,以便在异常失败时可以轻松看到异常。我尝试了AddWithValue方法,结果出现了相同的错误。是否尝试在
命令中不提供大小。Parameters.add()
commands?我使用try-catch在消息框中显示异常,它给出的数据指向VL2=command.Parameters.Add(“@VL2”,System.data.SqlDbType.Float)Ops!在没有size参数的方法的msdn示例中,稍后将指定size。很高兴看到你的问题解决了。问候语!我会试试看它是否会写入我的表格。我希望它能起作用,因为我更喜欢这种格式来写SQL,而不是AddWithValue方法。这对我来说也很有效,谢谢你,你是我的英雄。我可以保持我喜欢的格式。
Dim cn As System.Data.SqlClient.SqlConnection
Dim command As System.Data.SqlClient.SqlCommand
Dim VL1 As System.Data.SqlClient.SqlParameter
Dim VL2 As System.Data.SqlClient.SqlParameter
Dim VL3 As System.Data.SqlClient.SqlParameter
Dim VL4 As System.Data.SqlClient.SqlParameter
Dim commandText As String
cn = New System.Data.SqlClient.SqlConnection(ConnectStr)
cn.Open()
commandText = "INSERT INTO [dbo].[HourMeterLog]" _
+ "([MachineName],[TotalHours],[HLRD],[DateTime])" _
+ "VALUES (@VL1,@VL2,@VL3,@VL4)"
command = New System.Data.SqlClient.SqlCommand(commandText, cn)
VL1 = command.Parameters.AddWithValue("@VL1", "MachineName")
VL2 = command.Parameters.AddWithValue("@VL2", 0)
VL3 = command.Parameters.AddWithValue("@VL3", 735562)
VL4 = command.Parameters.AddWithValue("@VL4", Now())
'VL1 = command.Parameters.Add("@VL1", System.Data.SqlDbType.NVarChar, 25)
'VL2 = command.Parameters.Add("@VL2", System.Data.SqlDbType.Float)
'VL3 = command.Parameters.Add("@VL3", System.Data.SqlDbType.Int)
'VL4 = command.Parameters.Add("@VL4", System.Data.SqlDbType.DateTime2)
'command.Prepare()
'VL1.Value = "MachineName"
'VL2.Value = 0
'VL3.Value = 735562
'VL4.Value = Now()
command.ExecuteNonQuery()
cn.Close()