2015-04-17 57 views
3

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

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来写入数值字段,但是我第一次启动此代码(从此以后不再使用)就可以工作。

+0

对于那些谁想知道我有连接字符串为全班声明,因为我只写入这个程序的一台服务器。它是灰暗的:服务器=服务器;用户=用户; pwd =密码;数据库=示例 – ARidder101

+1

已经有一段时间,因为我做了很多的SQL,但我不认为你需要提供Int或DateTime2参数的长度。尝试一下,看看它是否有效? – GoldieLocks

+0

首先 - 我建议你在使用语句时规定你的连接等。第二 - 尝试只是为参数做AddWithValue(https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparametercollection.addwithvalue%28v=vs.110%29.aspx),并放下准备(至少现在让事情变得简单)。如果链接中的代码示例有效,则您知道您的连接工作。最后添加一个try/catch,以便在失败时很容易看到异常。 –

回答

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

我会尝试,看看它是否写入我的表。这里希望它可以工作,因为我更喜欢这种格式来写入SQL和AddWithValue方法。 – ARidder101

+0

对我也有效,谢谢你是我的英雄。我得到保持我的格式,我更喜欢它。 – ARidder101

0

对于错误的messge,不知道你表什么...

“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) 
+0

我用了一个try catch,并在消息框中显示异常,它给的数据指向我在VL2 = command.Parameters.Add(“@ VL2”,System .Data.SqlDbType.Float) – ARidder101

+0

Ops!在没有大小参数的方法的msdn示例中,稍后分配大小。很高兴看到你的问题解决了。问候! – Caveman

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)字段。除了那一栏外,其他的可以从代码中推断出来。