2009-01-23 99 views
0

我已經爲一個更大的公司作爲自由職業者跳入正在進行的.Net 2.0 Web應用程序項目。他們的DAL具有許多手動構建和執行SQL語句的功能 - 其中很多都是漫長而混亂的,因此很難理解和調試。我寫了一個簡單的「SQL助手」,讓我這樣寫:.Net的簡單SQL語句生成器

 
sqlh.addValue("name", name); 
sqlh.addValue("address, address); 
sqlh.addLiteral("created", "getDate()"); 

string sql = String.Format("INSERT INTO [Table1] ({0}) values ({1})", sqlh.getInsertFields(), sqlh.getInsertValues()); 

它處理空值和也適用於更新。就是這樣。

理想情況下,我會使用微軟數據應用程序塊或LINQ或其他東西,但在這一點上主要的體系結構變化是不可能的。這種方法爲我節省了很多時間,但似乎是通過使用「社區認可」解決方案最好解決的問題。

是否有一種流行的輕量級解決方案能夠實現類似的結果,從Microsoft或其他方面?

編輯

雖然到目前爲止所描述的SqlParameter的解決方案是在一個純手工的說明建立方法的改進,我想我還是喜歡我的解決方案,其中僅增加或從查詢刪除場影響單個線。有什麼更好的?感謝

+0

getInsertValues()是做什麼的? – AnthonyWJones 2009-01-23 16:46:08

+0

getInsertFields()=>「[name],[address],[created]」 getInsertValues()=>''Bill','123 Street',getDate()「 – Bill 2009-01-23 16:57:11

回答

0

的SqlCommand和SqlParameter的對象可能是你有幫助:

Dim sc As New SqlClient.SqlCommand 

    Dim sp As New SqlClient.SqlParameter("@value", SqlDbType.VarChar) 
    sp.Value = "test" 

    sc.Parameters.Add(sp) 
    sc.CommandText = "select column1, column2 from table where [email protected]" 

    sc.ExecuteReader() 

其vb.net,但你的想法。這將有助於防止SQL注入,並且看起來整潔並且可讀。

不要忘記設置你的連接字符串等

1

我創建了自己的存儲過程創建一個基於給定表模式insert語句,我以爲我是相當真棒。後來我發現這一點:

CREATE PROC sp_generate_inserts

編輯

我知道,我發現關於腳本作爲之前的SO後的結果,但現在我不能找到它,如果其他人知道,請編輯/或添加評論,我會編輯。

1

您有幾個選擇來自Microsoft:ADO.NET或Linq2Sql是當前流行的。但是,您提到的鏈接,將生成SQL轉換爲ORM需要花費大量的工作量。

爲了使SQL的創建更直接更安全,您應該考慮使用SQL參數。以下是一個示例:

using (SqlCommand saveCommand = DbUtil.CreateSqlCommand(context.Transaction)) { 
    saveCommand.CommandText = 
     "INSERT INTO Hit (" + 
      "Id, PersonId, TeamId, PlayerId" + 
     ") VALUES (" + 
      "@Id, @PersonId, @TeamId, @PlayerId" + 
     ")"; 

    DbUtil.AddParameter(saveCommand, "@Id", SqlDbType.UniqueIdentifier, Guid.NewGuid()); 
    DbUtil.AddParameter(saveCommand, "@PersonId", SqlDbType.UniqueIdentifier, hit.PersonId); 
    DbUtil.AddParameter(saveCommand, "@TeamId", SqlDbType.UniqueIdentifier, hit.TeamId); 
    DbUtil.AddParameter(saveCommand, "@PlayerId", SqlDbType.UniqueIdentifier, hit.PlayerId); 

    saveCommand.ExecuteNonQuery(); 
} 

這會將您的參數列表從SQL中分離出來。而且我們的SQL更清晰易讀。這個例子中的DbUtil只是一個幫助函數,我通過連接或事務創建了我的sql命令。也類似於你的sqlh.addValue,我有一個DbUtil.AddParameter,它通過接受命令,變量名,數據類型和值來工作。這裏有一個包含重載方法的示例:

internal static SqlParameter CreateSqlParameter(
    string parameterName, 
    SqlDbType dbType, 
    ParameterDirection direction, 
    object value 
) { 
    SqlParameter parameter = new SqlParameter(parameterName, dbType); 

    if (value == null) { 
     value = DBNull.Value; 
    } 

    parameter.Value = value; 
    parameter.Direction = direction; 
    return parameter; 
} 

internal static SqlParameter AddParameter(
    SqlCommand sqlCommand, 
    string parameterName, 
    SqlDbType dbType 
) { 
    return AddParameter(sqlCommand, parameterName, dbType, null); 
} 

internal static SqlParameter AddParameter(
    SqlCommand sqlCommand, 
    string parameterName, 
    SqlDbType dbType, 
    object value 
) { 
    return AddParameter(sqlCommand, parameterName, dbType, ParameterDirection.Input, value); 
} 

internal static SqlParameter AddParameter(
    SqlCommand sqlCommand, 
    string parameterName, 
    SqlDbType dbType, 
    ParameterDirection direction, 
    object value 
) { 
    SqlParameter parameter = CreateSqlParameter(parameterName, dbType, direction, value); 
    sqlCommand.Parameters.Add(parameter); 
    return parameter; 
} 

internal static SqlParameter AddParameter(
    SqlCommand sqlCommand, 
    string parameterName, 
    SqlDbType dbType, 
    ParameterDirection direction 
) { 
    SqlParameter parameter = CreateSqlParameter(parameterName, dbType, direction, null); 
    sqlCommand.Parameters.Add(parameter); 
    return parameter; 
}