无法写入SQL

时间:2015-04-17 12:28:35

标签: sql-server vb.net

我已经在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写入数字字段,但我第一次启动此代码时工作(从那时起没有一次)。

3 个答案:

答案 0 :(得分:2)

根据MSDNDateTime2的最大字符长度为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()

答案 1 :(得分:0)

对于错误消息,对你的桌子一无所知......

" SqlCommand.Prepare方法要求所有可变长度参数具有明确设置的非零大小"

来自MSDN(https://msdn.microsoft.com/en-us/library/40959t6x(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1

'Declaration
Public Function Add ( _
parameterName As String, _
sqlDbType As SqlDbType, _
size As Integer _
) As SqlParameter

也许你的问题来自:

VL4 = command.Parameters.Add("@VL4", System.Data.SqlDbType.DateTime2, 0)

将其更改为

VL4 = command.Parameters.Add("@VL4", System.Data.SqlDbType.DateTime2)

答案 2 :(得分:0)

好吧所以我想我在尝试时写了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()

我真的更喜欢使用之前使用的格式,但我很高兴我至少现在正在写作。谢谢你的帮助。如果有人对如何改进我的原始格式以使其正确写入有任何想法让我知道。对于那些想要在桌面上获得一些信息的人我也在写Float写的字段是Numeric(18,1)字段。除了该列,其他列可以从代码中推断出来。