BLOB, SQL Veritabanı Ekleme

Düzeltemediğim bir hatam var ... Gerçekten nedenini bilmiyorum.

Veritabanımdaki bir dosyayı yüklemek için bu kodu kullanıyorum, şimdi BLOB'u kullanmak istiyorum.

if (FileUpload1.HasFile)
                    try
                    {

                        //FileUpload1.SaveAs("C:\\inetpub\\wwwroot\\ClientPortalCs\\"
                        //+ GetTheCurrentDirectory(MyTreeView.SelectedNode)
                        //+ "\\" + FileUpload1.FileName);
                        //LabelFile.Text = "File name: " +
                        //FileUpload1.PostedFile.FileName + "
" + //FileUpload1.PostedFile.ContentLength + " kb
" + //"Content type: " + FileUpload1.PostedFile.ContentType; dbConnection.Open(); dynamic queryString = ("INSERT INTO Files (Name,Path,UserUpload,Date,Data) VALUES ('" + FileUpload1.FileName + "','" + GetTheCurrentDirectory(MyTreeView.SelectedNode) + "','" + Request.Cookies["UserSettings"]["UserName"] + "','" + DateTime.Now + "','" + FileUpload1.FileBytes + "' );" + "SELECT CAST(scope_identity() AS int)"); SqlCommand theCommand1 = new SqlCommand(queryString, dbConnection); int newFid = (Int32)theCommand1.ExecuteScalar(); dynamic queryStringFolder = ("INSERT INTO FILES_FOLDERS (Folder_Id,File_Id) VALUES ('" + MyTreeView.SelectedValue + "'," + "'" + newFid + "')"); theCommand1 = new SqlCommand(queryStringFolder, dbConnection); theCommand1.ExecuteNonQuery(); dbConnection.Close(); }

Veritabanımda tablo dosyalarındaki DATA alanı bir varbin (max). Sorgudaki DATA alanı parametresi, yüklemeyi denediğim dosyanın baytlarıdır.

Oluşan hata: "Hata veri türü varchar değişken varyasyon (max) izin verilmiyor. Bu sorguyu çalıştırmak için CONVERT işlevini kullanın."

Birisi bana nedenini söyleyebilir mi ?

Çok teşekkür ederim .

0
Bunun gibi bir kod sadece SQL Injection saldırısı için yalvarıyor. Lütfen parametreli sorgular kullanın.
katma yazar GvS, kaynak

1 cevap

Sorun şu ki, bir dizge olarak görüntünüzün bayt [] 'ında geçiyorsunuz, çünkü tek tırnak içine alıyorsunuz.

Buradaki tek alıntıları buradan kaldırın:

'" + FileUpload1.FileBytes + "'"

Bir daha öneri: Sorgularınız için parametreleri kullanın. Kendinizi sql enjeksiyon saldırılarına karşı koruyacaksınız, sorgularınız daha hızlı çalışacak ve gelecekte bu tür hataları ortadan kaldıracaksınız.

UPDATE - using parameters:

string queryString = "INSERT INTO Files (Name,Path,UserUpload,Date,Data) VALUES (@Name,@Path,@UserUpload,@Date,@Data)";
SqlCommand theCommand1 = new SqlCommand(queryString, dbConnection);
theCommand1.Parameters.AddWithValue("@Name",FileUpload1.FileName);
theCommand1.Parameters.AddWithValue("@Path",GetTheCurrentDirectory(MyTreeView.SelectedNode));
theCommand1.Parameters.AddWithValue("@UserUpload",Request.Cookies["UserSettings"]["UserName"]);
theCommand1.Parameters.AddWithValue("@Data",FileUpload1.FileBytes);
theCommand1.Parameters.AddWithValue("@Date",DateTime.Now);

int newFid = (Int32)theCommand1.ExecuteScalar();
2
katma
Tamam yapıldı ! Ama şimdi bu hatayı neden aldım? Hata Bir nesne veya sütun adı eksik veya boş. SELECT INTO ifadeleri için, her sütunun bir adı olduğunu doğrulayın. Diğer ifadeler için boş takma adlara bakın. "" Veya [] olarak tanımlanan takma adlara izin verilmez. Takma adı geçerli bir ada sahip olacak şekilde değiştirin. Yanlış sözdizimi yanında ''.
katma yazar Kiwimoisi, kaynak
Evet .. Dosyalar (İsim, Yol, Kullanıcı Yüklemesi, Tarih, Veri) DEĞERLERİNİ TAKİP EDİN ('WSB BOXE 20.jpg', 'Projeler//TEST /', 'Yönetici', '10/28/2011 12:41:16 PM ', System.Byte []); SELECT CAST (scope_identity() AS int) İyi görünmüyor ..
katma yazar Kiwimoisi, kaynak
System.Byte [] yerine sayıları görebilmeliydim, değil mi?
katma yazar Kiwimoisi, kaynak
Bunun yerine Parametreleri kullanırsam neyin değişeceğini gerçekten göremiyorum.
katma yazar Kiwimoisi, kaynak
Tamam iyi ! Bu gerçekten çok yardımcı oldu. Çok teşekkür ederim .
katma yazar Kiwimoisi, kaynak
Tamam, tüm mu işlevlerini değiştireceğim. İyi çalışıyor, ama bir şey düşünüyorum. Veritabanında neden bir dosyanın veri alanı <İkili Dosya>? Bu alanda sayılar görmüyor muyum?
katma yazar Kiwimoisi, kaynak
Her şey iyi çalışıyor! Ve indirme de.
katma yazar Kiwimoisi, kaynak
@Emged şimdi yanlış bir sözdizimi var. SQL Server'a gönderdiğiniz sql deyimini yazdırın ve nasıl göründüğünü görün.
katma yazar Icarus, kaynak
@Emged Gördüğüm ... Bayt dizisini satır içi sqlde böyle geçirirsiniz. Bunun yerine parametreleri kullanın. 5 saniyede bir örnek vereceğim.
katma yazar Icarus, kaynak
@Emged şimdi dışarı çıkmalıyım, fakat parametriezed sql sorgularını okudum.
katma yazar Icarus, kaynak
@Emged, süper güzel :)
katma yazar Icarus, kaynak
@Emged Ve diğer tüm sayfaları parametreli sorgulara da değiştir.
katma yazar GvS, kaynak
@Emged, şimdi aldığınız hata bu. Ancak şu anda SQL'inizi oluşturmak için kullandığınız teknik güvenli değildir. Verilerinize bu şekilde erişmeye devam ederseniz, en aptal hacker bile sitenizi kesmek için çok (son derece) kolay olacaktır. Ve sadece lekelerden bahsetmiyorum. Hatta kodlama olmadan SQL'inize bir çerez ekleyebilirsiniz. Bir bilgisayar korsanı kullanıcı adı çerezini şu şekilde değiştirirse: Robert ', null, null); masa dosyaları bırakın; - ?
katma yazar GvS, kaynak