none
C# SQL Sorguyu Direk Parametreye aktarma ? RRS feed

  • Soru

  • if (e.KeyCode == Keys.Enter)
                {
    
                    string sql = "INSERT INTO TBLPBIM3DEPOFISI (SIND,BARKOD,MCINSI,MIKTAR,BELGENO,KULLANICI,DEPOKODU)" + "VALUES(@SIND,@P1,@P2,@P3,@P4,@P5,@P6)";
                    SqlCommand cmd = new SqlCommand(sql, bag);
                    bag.Open();
                    
                    cmd.Parameters.AddWithValue("@SIND", ??????? );
                    cmd.Parameters.AddWithValue("@P1", textBox1.Text);
                    cmd.Parameters.AddWithValue("@P2", textBox2.Text);
                    cmd.Parameters.AddWithValue("@P3", textBox3.Text);
                    cmd.Parameters.AddWithValue("@P4", textBox4.Text);
                    cmd.Parameters.AddWithValue("@P5", "ADMIN");
                    cmd.Parameters.AddWithValue("@P6", "MERKEZ");
    
    
                    if (cmd.ExecuteNonQuery() > 0)
                    {
                        bag.Close();
                    }
    iyi geceler.sql kayıt eklemek istiyorm fakat forma yazılı stoğun indeksini gidip stoklar tablasondan getirmesini istiyorum forma her hangi bir yere yazmadan bu işlemi nasıl yapabilirim acaba yardımcı olabilirmisiniz.?textbox1'de ki stok kodu şu olan ürünün IND'ini @SIND'E Yazmak istiyorum yani formun içerisine değil.
    30 Eylül 2013 Pazartesi 20:26

Yanıtlar

  • EF de bir örnek;

    Varsayalım fatura kaydı yapacağız;

    var db = new MyDatabaseContext();
    
    List<Items> items = new List<Items>() {
      new Item() { ProductId = 1, Quantity = 1, Price = 5.0m },
      new Item() { ProductId = 7, Quantity = 3, Price = 4.3m },
      new Item() { ProductId = 18, Quantity = 1, Price = 12.0m }
    };
    
    db.Invoices.Add(new Invoice() {
        Date = DateTime.Now,
        CustomerID = 1,
        Items = items
    });
    
    db.SaveChanges();

    Burası SaveChanges satırında hem Fatura(Invoice) tablosuna bir kayıt hem de Fatura Detayı(Items) tablosuna üç kayıt ekleyecek sorguyu runtime de oluşturur, tek seferde çalıştırır, foregin keyleri ve id leri otomatik ayarlar. Connectionlarla parameterlerle falan uğraşmak zorunda kalmazsınız. Veri tiplerini dert etmezsiniz. Bu sayede yazacağınız kodun işlevselliğine odaklanabilirsiniz.


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC


    3 Ekim 2013 Perşembe 14:25

Tüm Yanıtlar

  • http://www.w3schools.com/sql/sql_insert_into_select.asp

    Buradaki gibi bir şey mi istediğin?

    30 Eylül 2013 Pazartesi 20:42
  • http://www.w3schools.com/sql/sql_insert_into_select.asp

    Buradaki gibi bir şey mi istediğin?

    oradaki anlatılanları pek fazla algılayamadım ama şöyle antalayım form'da ki tüm bilgi alanları dolu barkod malıncınsı filan falan hepsi ben onları bir tabloya atacağım bizim şirkette ki programın kullandığı tabloya uyumlu olabilmesi için STOKKODU'NUN IND'ini de o tabloya eklemem lazım parametredeki tüm değerler zaten formdan alıyor ben sadece IND'i sql sorgu ile çağırıp parametre de ki @SIND=(bu alana getirmek istiyorum)

    şunu denedim

    string sorgu="SELECT IND FROM F0101TBLSTOKLAR WHERE STOKKODU='"+textBox1.Text+"'

    cmd.Parameters.AddWithValue("@SIND", convert.toınt32 (sorgu));

    ama hata verdi büyük ihtimalle saçma birşey yazdım ondandır :)

    30 Eylül 2013 Pazartesi 21:02
  • Doğru anlamışsam, insert içinde subquery kullanman gerekiyor. Aşağıdaki örnek daha anlaşılır.

    http://decoding.wordpress.com/2008/10/11/sql-server-insert-into-with-subquery/

    Senin örneğine göre şöyle bir mantık:

    string sql = "INSERT INTO TBLPBIM3DEPOFISI (SIND,BARKOD,MCINSI,MIKTAR,BELGENO,KULLANICI,DEPOKODU)"

    + "VALUES((select sid from tablo where kod=@kod),@P1,@P2,@P3,@P4,@P5,@P6)";

    30 Eylül 2013 Pazartesi 21:57
  • Doğru anlamışsam, insert içinde subquery kullanman gerekiyor. Aşağıdaki örnek daha anlaşılır.

    http://decoding.wordpress.com/2008/10/11/sql-server-insert-into-with-subquery/

    Senin örneğine göre şöyle bir mantık:

    string sql = "INSERT INTO TBLPBIM3DEPOFISI (SIND,BARKOD,MCINSI,MIKTAR,BELGENO,KULLANICI,DEPOKODU)"

    + "VALUES((select sid from tablo where kod=@kod),@P1,@P2,@P3,@P4,@P5,@P6)";

    Subqueries are not allowed in this context. Only scalar expressions are allowed.

    (Alt sorgular bu bağlamda izin verilmez. Sadece rakamsal ifadeler izin verilir.)

    Bu hatayı veriyor.bir yeri convert.toint mi yapmam gerekiyor acaba ?

    1 Ekim 2013 Salı 06:51
  • küçük bir dokunuşla çalışacaktır, subquery scalar olmalı ama rowset sanıyor, onun için alt sorgunun tek kayıt döndürecek şekilde ayarlamanız yeterli;

     "VALUES((select top(1) sid from tablo where kod=@kod),@P1,@P2,@P3,@P4,@P5,@P6)";

    sorguya top(1) eklerseniz çalışır


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    1 Ekim 2013 Salı 06:58
  • küçük bir dokunuşla çalışacaktır, subquery scalar olmalı ama rowset sanıyor, onun için alt sorgunun tek kayıt döndürecek şekilde ayarlamanız yeterli;

     "VALUES((select top(1) sid from tablo where kod=@kod),@P1,@P2,@P3,@P4,@P5,@P6)";

    sorguya top(1) eklerseniz çalışır


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    malesef çalışmadı sorgumu tekrardan yazayım ben size isterseniz benm bir hatam mı var acaba.

     private void textBox3_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter)
                {
    
                    string sql = "INSERT INTO TBLPBIM3DEPOFISI (SIND,BARKOD,MCINSI,MIKTAR,BELGENO,KULLANICI,DEPOKODU)" + "VALUES((SELECT top(1) IND FROM F0101TBLSTOKLAR WHERE STOKKODU=@SIND),@P1,@P2,@P3,@P4,@P5,@P6)";
                    SqlCommand cmd = new SqlCommand(sql, bag);
                    bag.Open();
                    cmd.Parameters.AddWithValue("@SIND", textBox1.Text);
                    cmd.Parameters.AddWithValue("@P1", textBox1.Text);
                    cmd.Parameters.AddWithValue("@P2", textBox2.Text);
                    cmd.Parameters.AddWithValue("@P3", textBox3.Text);
                    cmd.Parameters.AddWithValue("@P4", textBox4.Text);
                    cmd.Parameters.AddWithValue("@P5", "ADMIN");
                    cmd.Parameters.AddWithValue("@P6", "MERKEZ");
    
    
                    if (cmd.ExecuteNonQuery() > 0)
                    {
                        bag.Close();
                    }
                }
            }

    1 Ekim 2013 Salı 07:10
  • hata mesajı nedir acaba?


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    1 Ekim 2013 Salı 07:24
  • hata mesajı nedir acaba?


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    Subqueries are not allowed in this context. Only scalar expressions are allowed. Hata mesajı bu önay bey.

    1 Ekim 2013 Salı 08:19
  • SQL DATABASE DE SIND data ditipi decimal(18,0) olarak açılmış bununla alakalı bir durum olabilir mi acaba
    1 Ekim 2013 Salı 08:21
  • ilgilenen herkese teşekkür ederim kendi çabamla çözdüm sizlerle de paylaşmak istedim mantıklı bir çözüm mü fikrinizi alayım.

     private void textBox3_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter)
                {
    
                    string sql = "INSERT INTO TBLPBIM3DEPOFISI (SIND,BARKOD,MCINSI,MIKTAR,BELGENO,KULLANICI,DEPOKODU)" + "VALUES(@SIND,@P1,@P2,@P3,@P4,@P5,@P6)";
                    SqlCommand cmd = new SqlCommand(sql, bag);
                    bag.Open();
                    
                   string sorgu="SELECT IND FROM F0101TBLSTOKLAR WHERE STOKKODU='"+textBox1.Text+"'";
                   SqlDataAdapter sadp = new SqlDataAdapter(sorgu, bag);
                   DataTable dt = new DataTable();
                   sadp.Fill(dt);
    
    
                    cmd.Parameters.AddWithValue("@SIND",dt.Rows[0][0].ToString());
                    cmd.Parameters.AddWithValue("@P1", textBox1.Text);
                    cmd.Parameters.AddWithValue("@P2", textBox2.Text);
                    cmd.Parameters.AddWithValue("@P3", textBox3.Text);
                    cmd.Parameters.AddWithValue("@P4", textBox4.Text);
                    cmd.Parameters.AddWithValue("@P5", "ADMIN");
                    cmd.Parameters.AddWithValue("@P6", "MERKEZ");
    
    
                    if (cmd.ExecuteNonQuery() > 0)
                    {
                        bag.Close();
                    }
                }
            }

    bir datatable yaptım ve stok ınd onun içerisine attım oradan çağırdım.verimli bir çözümmüdür acaba ???


    Aykut Başar

    • Yanıt Olarak İşaretleyen Aykut Başar 1 Ekim 2013 Salı 09:55
    • Yanıt İşaretini Geri Alan Aykut Başar 4 Ekim 2013 Cuma 09:50
    1 Ekim 2013 Salı 09:30
  • değil tabiki de çalıştıysa sorun yok. 

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    1 Ekim 2013 Salı 10:52
  • değil tabiki de çalıştıysa sorun yok. 

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC


    neden değil önay bey ne gibi bir sıkıntı yaratır bana eğer sağlıklı değilse daha sağlıklı bir çözüm üzerinde çalışayım

    Aykut Başar

    2 Ekim 2013 Çarşamba 07:20
  • En iyi yöntem EF4 ve üzeri kullanmanız. Bunun iyi bir yöntem olmamasının nedeni , database'e birden fazla sorgu gönderiyor olması. Database'e her bağlanışınız performans kaybı demektir. EF4 'ün LazyLoad yapısı ile gerektiği kadar bağlanma işini kendisi hallediyor.

    Aslında işler sizin yaptığınız şekilde buttonun altına sql yazmak şeklinde yürümüyor. Bu kullandığınız yöntem daha önceden bildiklerinize yakın olduğundan size kolay geliyor. Yada size öğreten yanlış öğretmiş. Aslında EF olmadı DataSet kullansanız işlerin ne kadar sorunsuz ve kolayca yapıldığını farkedersiniz. 


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    3 Ekim 2013 Perşembe 07:39
  • EF de bir örnek;

    Varsayalım fatura kaydı yapacağız;

    var db = new MyDatabaseContext();
    
    List<Items> items = new List<Items>() {
      new Item() { ProductId = 1, Quantity = 1, Price = 5.0m },
      new Item() { ProductId = 7, Quantity = 3, Price = 4.3m },
      new Item() { ProductId = 18, Quantity = 1, Price = 12.0m }
    };
    
    db.Invoices.Add(new Invoice() {
        Date = DateTime.Now,
        CustomerID = 1,
        Items = items
    });
    
    db.SaveChanges();

    Burası SaveChanges satırında hem Fatura(Invoice) tablosuna bir kayıt hem de Fatura Detayı(Items) tablosuna üç kayıt ekleyecek sorguyu runtime de oluşturur, tek seferde çalıştırır, foregin keyleri ve id leri otomatik ayarlar. Connectionlarla parameterlerle falan uğraşmak zorunda kalmazsınız. Veri tiplerini dert etmezsiniz. Bu sayede yazacağınız kodun işlevselliğine odaklanabilirsiniz.


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC


    3 Ekim 2013 Perşembe 14:25