2012-10-09 79 views
3

我想知道什麼是避免以下情況的最基本的方法。打開/關閉sql連接 - 冗餘代碼

con.ConnectionString = connection_String 
    con.Open() 
    cmd.Connection = con 

    'database interaction here 

    cmd.Close() 

我一直在我的項目使這些線路都結束了,但我想,必須有一個更好的方式,以節省一遍又一遍打字。它使代碼看起來比現在更加草率!

結束了這一點,適合我。感謝您的幫助:)

Public Sub connectionState() 
    If con.State = 0 Then 
     con.ConnectionString = connection_String 
     con.Open() 
     cmd.Connection = con 
    Else 
     con.Close() 
    End If 
End Sub 
+3

做一個函數/程序? –

+1

請不要破壞您的問題 - 除非您即將關閉它。 –

+2

在正常情況下,最好有一個連接到您的程序期間使用的數據庫。 – dan1111

回答

2

這是很多程序員都禁不住創建一個「數據庫層」與方法簽名一個變化是這個樣子:

Public DataSet ExecuteSQL(ByVal sql As String) As DataSet 

這可以隔離所有這些樣板連接代碼在一個地方。一個sql命令字符串進入,數據出來。簡單。

不要這樣做!

這是朝着正確的方向,但有一個非常大的缺陷:它迫使你使用字符串操作來替換參數值到你的SQL查詢中。這導致了可怕的SQL注入安全漏洞。

相反,請確保在您的方法中包含一些機制以分別提示輸入sql參數。這通常以函數的附加參數的形式出現,並且可以像KeyValuePairs數組一樣簡單。如果您熟悉lambda表達式,我的首選模式是這樣的:

Public Iterator Function GetData(Of T)(ByVal sql As String, ByVal addParameters As Action(Of SqlParameterCollection), ByVal translate As Func(Of IDatarecord, T)) As IEnumerable(Of T) 
    Using cn As New SqlConnection("connection string"), _ 
      cmd As New SqlCommand(sql, cn) 

     addParameters(cmd.Parameters) 

     cn.Open() 
     Using rdr As SqlDataReader = cmd.ExecuteReader() 
      While rdr.Read() 
       Yield(translate(rdr)) 
      End While 
     End Using 
    End Using 
End Function 

要調用該函數,你會做這樣的事情:

Dim bigCustomers = GetData("SELECT * FROM Customers WHERE SalesTotal > @MinSalesTotal", _ 
        Sub(p) p.Add("@MinSalesTotal", SqlDbType.Decimal, 1000000), _ 
        MyCustomerClass.FromIDataRecord) 
+0

感謝您的評論。 – Meowbits

2

你可以嘗試創建一個類(一個單例類),並寫在該類數據庫連接代碼的語法和異常,然後調用一個對象的主類來創建數據庫連接,這是性能的最佳方式,並繼續編寫相同的代碼...

+1

單身人士在這裏是一個糟糕的選擇。它限制你訪問一個數據庫的線程。我犯了一次錯誤。就一次。 –

+0

據我所知,我不認爲這被認爲是一個錯誤,但選擇使用DB –

0

您可以使用只是using block,使用執行處理結束時處理非託管對象。

鏈接:http://msdn.microsoft.com/en-us/library/htd05whh(v=vs.80).aspx

+0

進行具體的項目對我來說很小,但我不懷疑它會有用。我只是想在這裏漂浮;) 雖然欣賞它! – Meowbits

+0

我很樂意幫助你Meowbits,你也可以使用剛剛使用blok –