2014-03-05 33 views
0

我運行下面的代碼(的一部分)的SQL數據添加到一個數據庫需要連接到PHPmyadmin DB是.ExecuteNonQuery()來在vb.net

Private Sub sreg_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

     SqlConnection.ConnectionString = ServerString 



     Try 
      If SqlConnection.State = ConnectionState.Closed Then 
       SqlConnection.Open() 
       MsgBox("Successfully connected to MySQL DB") 
      Else 
       SqlConnection.Close() 
       MsgBox("Connection is Closed") 
      End If 
     Catch ex As Exception 
      MsgBox(ex.ToString) 

     End Try 
    End Sub 

Public Sub SaveNames(ByRef SQLStatment As String) 
     Dim cmd As MySqlCommand = New MySqlCommand 

     With cmd 
      .CommandText = SQLStatment 
      .CommandType = CommandType.Text 
      .Connection = SqlConnection 
      .ExecuteNonQuery() 
     End With 

     SqlConnection.Close() 
     MsgBox("Succesfully Added!") 
     SqlConnection.Dispose() 
    End Sub 

然而.ExecuteNonQuery()是給了我巨大的在錯誤和問題方面令人頭痛。它上傳數據,但它只能做一次(一次上傳),它會返回一個錯誤。

當我刪除了.ExecuteNonQuery()沒有數據被上傳?所以我想這是必要的。

這裏是代碼即時上傳(的一部分)

sql = "INSERT INTO students(student_id, title, initial, surname, 
street, city, pcode, country) VALUES ('" & strStudent & "', '" 
& vtital & "', '" & vinital & "', '" & vsurname & "', '" & vstreet 
& "', '" & vcity & "', '" & vpcode & "', '" & vcountry & "')" 

SaveNames(sql) 

希望我的問題是有道理的,我也可以得到跨

+0

在學生表是student_id數據的主鍵自動增加?什麼是你得到的錯誤信息? – Milen

+1

'它返回一個錯誤'什麼錯誤? – walther

+0

@MilenPavlov是student_id數據是主鍵不自動增加 – Marilee

回答

0

有你的方式來保存這個一些錯誤可能導致您的問題的數據。
第一個問題是代碼不使用參數化查詢。這是一個安全問題(Sql注入),但也是一個簡單的邏輯問題。如果連接字符串以構建sql查詢,那麼對於包含對數據庫sql引擎有特殊含義的字符的字符串有問題。如果你的一個字符串包含單引號會怎麼樣?它將被視爲字符串的結尾,其餘部分爲無效的sql。

第二個問題是的缺乏開啓/關閉/還處置的MySqlConnection在例外情況下。這可以通過使用Using Statement來解決。

所以我會重寫你的方法

Public SaveNames(ByRef SQLStatment As String, List(Of MySqlParameter) parameters) As Integer 
    Using con = new MySqlConnection(... put here the connection string...) 
    Using cmd = New MySqlCommand(SQLStatment, con) 
     if parameters.Count > 0 Then 
      cmd.Parameters.AddRange(parameters.ToArray()) 
     End If 
     return cmd.ExecuteNonQuery() 
    End Using 
    End Using 
End Function 

,及代碼調用它

sql = "INSERT INTO students(student_id, title, initial, surname," & _ 
     "street, city, pcode, country) VALUES (@id,@title,@init,@sur," & _ 
     "@street,@city,@pcode,@country)" 
Dim ps = New List(Of MySqlParameters)() 
Dim p = new MySqlParameter("@id", MySqlDbType.Int32).Value = Convert.ToInt32(strStudent) 
ps.Add(p) 
p = new MySqlParameter("@title", MySqlDbType.VarChar).Value = vtital 
ps.Add(p) 
.. and so on for the other parameters. 
.. respecting the actual datatype on the database table 
..... 
SaveNames(sql, ps) 
+0

謝謝您的回答,生病給它一個鏡頭。 1個問什麼是PS的'SAVENAME(SQL,PS)' – Marilee

+0

就打開關閉處置我有,但並沒有在這裏添加到我的代碼代表,請參閱問題 – Marilee

+0

的編輯版本的PS是MySqlParameters的列表。有必要將它傳遞給您的SaveNames,因爲sql命令文本包含實際值的佔位符,並且這些值與參數列表一起傳遞。我找不到有關MySql的示例,但Sql Server的衆多示例以相同的方式工作,只是更改了類名。 – Steve

0

消息請嘗試......

cmd = New MySqlCommand(sqlstatement, conn) 
conn.open() 

cmd.ExecuteNonQuery() 
conn.Close() 

正如我建議你..使用參數