Sql server 写入SQL时遇到问题

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

我已经在VB.Net中写了几个月了,在我的代码中多次成功地使用SQL命令,但在写入数据库中的一个特定表时遇到了问题。我相信问题在于我有一个数字列,我正试图写入它(我得出这个结论是因为它是我唯一不经常使用的列),我的代码不断出现一个异常:附加信息:SqlCommand.Prepare方法要求所有可变长度参数都显式设置为非零大小。使用代码:

    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()