2008-12-17 13 views
7

Veritabanına iletilecek bir dizenin veya bir NULL öğesinin izin verilebilmesi için uygun sözdizimiyle ilgili sorun yaşıyorum. veritabanı düzgün bir dize değeri kabul edeceğini böylece değişken tutucuları tek tırnak kullanılırSQL Server veritabanına dize veya NULL yerleştirme sorunu

string insertString = String.Format(
    @"INSERT INTO upload_history (field1, field2, field3) 
    VALUES ('{0}', '{1}', '{2}')", 
    varField1, varField2, varField3); 

: İşte benim kod. Ancak, NULL geçilirse, veritabanına "NULL" dizesi olarak girer.

Tek tırnakları InsertCommand dizesinden ayırabilmemin ve şartlı olarak değişkenlerime tek tırnak işareti ekleyebileceğim bir yöntem var mı?

cevap

22

dize (string.Format) bitiştirmek etmeyin - kullanım parametreleri (@p1 vs.) - o zaman SQL Server boş anlamında DBNull.Value geçebilir Bu aynı zamanda SQL enjeksiyonu korur

SqlCommand cmd = new SqlCommand(); 
cmd.CommandText = @"INSERT INTO upload_history (field1, field2, field3) 
    VALUES (@p1, @p2, @p3)"; 
cmd.Parameters.AddWithValue("@p1", (object)someVar ?? DBNull.Value); 
//... 

+0

:-) zor değildir: "Operatör ' ??' tip dizesi ve System.DBNull için işlenenlere uygulanamaz. "Bunun bir dizeyle nasıl çalışacağına dair herhangi bir düşünce var mı? – buzzzzjay

+2

@buzzzzjay, bunlardan birinin önüne bir '' (nesne) 'ekleyin. –

+0

Sweet! Bu gerçekten yardımcı olur! Teşekkürler! – buzzzzjay

5

String.Format ile dizgiyi birleştirmek büyük bir güvenlik riski (SQL Injection) olabilir ve 'karakterini eklemek istiyorsanız sorunlu olabilir.

Çözüm:

o istendi sorusunu yanıtlayan ve sorguları paramaterizing için kod üstlenmeden doğru çözüm olduğunu tam olarak farkında olma ruhuyla
cmd.CommandText = "INSERT INTO upload_history (field1, field2, field3) " + 
    "VALUES (@p1, @p2, @p3)"; 
cmd.Parameters.AddWithValue("@p1", varField1); 
cmd.Parameters.AddWithValue("@p2", varField2); 
cmd.Parameters.AddWithValue("@p3", varField3); 
cmd.ExecuteNonQuery(); 
+0

Ayrıca harika bir cevap ama Marc size bunu yendi. Önerin için teşekkürler. – beardog

2

, ya döndüren bir fonksiyon yazabiliriz tek tırnaklı bir dize veya alıntılanmamış bir NULL dize değeri, daha sonra tek tırnaklı sorgu dizesinden kaldırın.

string insertString = String.Format( @"INSERT INTO upload_history (field1, field2, field3)  VALUES ({0}, {1}, {2})", ToStringorNull(varField1), ToStringorNull(varField2), ToStringorNull(varField3)); 

VS 2008 kullanıyorsanız, bunu bir uzantı yöntemi olarak da uygulayabilirsiniz.

string insertString = String.Format( @"INSERT INTO upload_history (field1, field2, field3)  VALUES ({0}, {1}, {2})", varField1.ToStringorNull, varField2.ToStringorNull, varField3.ToStringorNull); 

Sana ToStringorNull işlevini oluşturarak bırakacağım - bu "SomeVar ?? DBNull.Value" kullanırken yukarıdaki gibi aşağıdaki hatayı alıyorum

İlgili konular