Parametreler ile Seçimi boş sonuç sağlar

Şu anda kodumu biraz temizleyeceğim ve VS bana, SqlParameter komutunu sql komutları yerine string yerine kullanmak daha iyi olduğunu söyledi. Kodumu değiştirmeye karar verdim, maalesef artık bir sonuç alamıyorum ve nedenini bilmiyorum. İşte kodumun bir parçası:

...    
DataTable dt = new DataTable();
SqlConnection connection = new SqlConnection(GetSQLConnectionString());
SqlDataAdapter sqlSelect = new SqlDataAdapter();
try
{
    connection.Open();
    sqlSelect.SelectCommand = connection.CreateCommand();
    sqlSelect.SelectCommand.CommandText = "SELECT id, @FROM AS \"from\", @TO AS \"to\" FROM Dictionary WHERE @FROM LIKE @SEARCHSTRING";
    sqlSelect.SelectCommand.Parameters.Add(new SqlParameter("@FROM", this.from));
    sqlSelect.SelectCommand.Parameters.Add(new SqlParameter("@TO", this.to));
    sqlSelect.SelectCommand.Parameters.Add(new SqlParameter("@SEARCHSTRING", "'%" + this.SearchField.Text + "%'"));

    sqlSelect.Fill(dt);
    connection.Close();
}
catch(SqlException e)
...

Hiçbir istisna almıyorum. Aramadan sonra neden boştur? (Bileşik bir dizeyle, seçim çalışır.) Neler ters gitti?

Selamlamak

2
sütun adını parametre olarak geçemezsiniz
katma yazar Lucas_Santos, kaynak
çalıştıran bileşik dizginizi ekleyin
katma yazar Reniuz, kaynak
SqlParameter yolu çok daha temiz, bundan hoşlanıyorum. Kodumun neden çalışmadığı ilginç olurdu. @Lucas_Santos Bunu sütun adına değiştirdim, ancak dt hala boş. Selamlamak
katma yazar hofmeister, kaynak

3 cevap

Bu gibi parametreleri kullanarak alan adlarını belirleyemezsiniz. WHERE @FROM LIKE @SEARCHSTRING ifadesinde, @FROM parametresinin değerini @SEARCHSTRING parametresi ile karşılaştırır.

Nerede doğru olarak değerlendirilirse, sözlük tablosunda her kaydı alacaksınız, eğer yanlış olarak değerlendirilirse kayıt alamazsınız. Hiçbir zaman sözlük tablosunda @ alan içeriğini bir alan adı olarak ele almayacaktır.

2
katma
Evet, aynıysa, tüm tabloyu alacaksınız. Alan adlarını belirlemek için parametreler kullanmak istiyorsanız, Sql dizginizi dinamik olarak oluşturmanız gerekecektir. Bunu yapmanın en güvenli yolu, spExecuteSql msdn.microsoft.com/en- tr/kütüphane/ms188001.aspx
katma yazar Ben Robinson, kaynak
Tamam, test ettim ve haklısın! Sorun, gerçekten nerede yan tümce. (Sütun konumundaki parametreler düzgün çalışıyor). Daha iyi bir kavrayış için WHERE @FROM LIKE @SEARCHSTRING 'i her iki değeri de karşılaştırıyorlar, eğer aynı ise, tam tabloyu alacağım, değil mi? @FROM 'a bir parametre eklemek mümkün mü yoksa sadece CommandText dizesini o konumda birleştirmem mümkün mü? Sağol selamlıyorum.
katma yazar hofmeister, kaynak

İnsanlar burada söyledikleri gibi, alan adlarını parametre olarak geçememenizdir.

Bir kaç sebepten ötürü almakta olduğunuz bir yaklaşımın kötü bir fikir olduğu, ilk olarak bir sql komutunu bu şekilde ilettiğinizde, sunucunun bu sorguyu her çalıştırdığınızda yeniden derlemesi gerekiyor, bu da sunucuya fazladan yükleme yapıyor ve performansı yavaşlatıyor. İkincisi, seçim ifadelerinizi bu gibi bir şekilde iletme riskidir, çünkü bunu kesişen herkese masa yapınıza bir bakış verir. Üçüncü olarak, bu gibi seçme ifadeleri kullanmak, kodu yeniden kullanmak istemiyorsanız kopyala yapıştırılamaz demektir.

Tavsiye edeceğim şey saklı bir prosedüre geçmektir. Yine de parametrelerinizden geçebilirsiniz ancak kodunuzu SQL'den aldığından ve yalnızca alakalı olanı kaldıracağından kodunuzu geliştirecektir.

Bu gibi select deyiminde kullanılmak üzere GERÇEKTEN alan adlarını gerçekten geçmeniz gerekiyorsa, bunu SQL'de yapabilir ve bir sorgu dizgisi oluşturabilir, ardından sp_executesql kullanarak yürütebilirsiniz.

Temel olarak yaptığınız şey gibi bir sorgu dizesi bildirmek

DECLARE @queryString VARCHAR(3000)

SET @queryString ='SELECT id, '[email protected]+' AS from, '[email protected]+' AS to FROM Dictionary WHERE +'@FROM+' LIKE %'[email protected]+'%'

sonra sadece @queryString'i çalıştırmak için sp_executesql kullanın

Sorgulama yaparken herhangi bir hata alırsanız, parametreleri Varchar olarak atamanız gerekebilir.

1
katma
@Taz Yayınladığım örneği, querystring'i% ile göstermek için güncelledim
katma yazar Purplegoldfish, kaynak
@Taz bunu kontrol edin, oldukça basittir, ancak bunun nasıl biraz genişletilebileceğini gösterir. pastebin.com/tZqQpzmW
katma yazar Purplegoldfish, kaynak
@taz Bir dizgeyi seçtiğinizde genellikle column = 'stringtext' yaparsınız, ancak değişkenleri kullandığınızda, oluşturduğunuz dizge, column = stringtext gibi görünmekle kalmaz, yapmanız gereken şey bu karakterlerin sunucuya geçtiğiniz param
katma yazar Purplegoldfish, kaynak
Evet, saha isimlerini gerçekten geçmem gerekiyor. Son kullanıcı bir açılır liste ile seçili sütunu değiştirebilir (güvenli olmadığını biliyordum, ancak başka bir yol bilmiyorum). Eğer doğru bir şekilde anlarsam, bir prosedür oluşturmak daha iyidir, prosedürü dinamik olarak ekleyin ve C# içinde doğru-sözdizimi "> burada . Ayrıca sql güncellemeleri, silme ve benzeri için? Selamlamak
katma yazar hofmeister, kaynak
Tamam, dediğin gibi bir prosedür ekledim. Şimdi arama dizesine ‘% ve%’ eklemek zorunda olduğum problemim var. C# kodunda sorun yok ve her şey iyi çalışıyor, ancak prosedürü sql sunucusundan yürütürsem nasıl tek bir fiyat teklifi ekleyebilirim? C# Yaparım: cmd.Parameters ["@ SEARCHSTRING"]. Değer = "'% string%'"; . Sql sunucusunda exec test_ procedure @FROM = 'FROMVALUE', @TO = 'TOVALUE', @SEARCHSTRING = 'STRING' komutunu çalıştırdım. Selamlamak
katma yazar hofmeister, kaynak
Eh, bu çalışır, ancak eşit ( = ) ile seçmeye çalışırsanız, sütun örneğin bir varchar ise, tek tırnaklar eksik. Biliyorum ilginç, sql sunucusunda bir sokmayı bekleyen bir prosedürü nasıl uygulayabilirim. Asıl sorun çözüldü. Selamlamak
katma yazar hofmeister, kaynak
Mhm, yanlış anlaşılmayı önlemek için doğru şekilde çalışır. Bir dizge bir dizge ise, sql sunucusundan nasıl bir prosedür uygulayabileceğimi bilmek isterim. Örnek olarak şunu çalıştırırsam: Procedure_Name @ FROM = coumn1, @ TO = coumn2, @ SEARCHSTRING = SEARCHSTRING , sql sunucusu, SEARCHSTRING 'in bir sütun olmadığını söyler. bu doğru. Arama için doğru sözdizimi ['SEARCHSTRING'] . Herkese teşekkürler! Selamlamak.
katma yazar hofmeister, kaynak

Neden böyle bir sorgu yazdınız?

   "SELECT id, @FROM AS \"from\", @TO AS \"to\" FROM Dictionary WHERE @FROM LIKE @SEARCHSTRING";

tablodan @FROM getirmeye çalışıyorsunuz ve aynı zamanda bir parametre olarak nasıl geçmeye çalışıyorsunuz, bunun nasıl çalışması gerekiyor? Ayrıca neden eğik çizgi eklediniz? Sadece işleri karışık hale getirirler, kaldırırlar. Bir Sorgu sorgusu, giriş parametrelerini yalnızca "WHERE" maddesiyle alır ve başka hiçbir yerde yoktur.

Bununla değiştirmeyi deneyin

"SELECT id, FROM AS 'from', TO AS 'to' FROM Dictionary WHERE FROM LIKE @SEARCHSTRING";

Ayrıca aşağıdakilerin tümünü de hariç tut:

sqlSelect.SelectCommand.Parameters.Add

Ayrıca "FROM" un bir SQL anahtar sözcüğü olduğu konusunda da dikkatli olun, bu yüzden "[]" ifadesine ekleyerek doğru şekilde yorumlandığından emin olun.

Bu yardımcı olur umarım...

0
katma