2017-02-26 3 views
0

Ich bin neu in C#, also vielleicht habe ich es nicht richtig geschrieben.C# mit SQL Abfrage Ergebnis zu Variable

In meinem C# Formular, ich setze order nr. in ein Formular. Dann überprüfen Sie dies in sql.

Notwendigkeit, diese Abfrage auszuführen:

  1. Erhalten OrderID von Order nr.

  2. müssen überprüfen, ob Order ID in [System_Opened_Orders] = Auftrag ist geöffnet

  3. Wenn Auftrag geöffnet wird, dann müssen zu laufen in C# Messagebox.Show("Order opened, try again later")

  4. Wenn nicht geöffnet, Lastdaten von order

SQL-Abfrage:


    Declare @OrderID uniqueidentifier 
    SET @OrderID = (SELECT m.ID FROM [Agenda].[dbo].[orders] m 
    WHERE m.OrderNumber= @sqlordernr)

if EXISTS (SELECT 1 FROM [Agenda].[dbo].[System_Opened_Orders] 
     WHERE [email protected]) 
      BEGIN 
        // Tell its opened, need try again later 
      END 

     ELSE 
      BEGIN 
        // Order is not openend, can get custommer data 
        select ID, OrderNumber, CustommerName, CustommerCity 
        FROM [Agenda].[dbo].[orders] where OrderNumber = @sqlordernr 
      END 

C# -Code:

SqlConnection conn = new SqlConnection("Data Source=localhost;Initial Catalog=Agenda;Persist Security Info=True;User ID=sa;Password=xxxxxxxx"); 
      conn.Open(); 

      SqlCommand command = new SqlCommand(/*sql query*/, conn); 
      command.Parameters.AddWithValue("@sqlordernr", odernr); 

      using (SqlDataReader reader = command.ExecuteReader()) 
      { 
       if (reader.Read()) 
       { 
        // if order is opened then Messagebox.Show 

        // if is not opened 
        // String OrderCustommerName = reader.GetString(3).TrimEnd(); 
        // String OrderCustommerCity= reader.GetString(4).TrimEnd(); 
        // lbOrderData.Text = OrderCustommerName + " " + OrderCustommerCity; 
       } 
      } 
      conn.Close(); 
+0

Die Antwort ist gut, aber wenn Sie möchten, können Sie SQL [Ausgabeparameter] versuchen (http://www.aspsnippets.com /Articles/How-to-return-Output-Parameter-from-Stored-Procedure-in-ASPNet-in-C-and-VBNet.aspx). –

Antwort

1

Sie müssen somethi zurückkehren ng von Ihrer if-Anweisung innerhalb der gespeicherten Prozedur. Sie können einfach einen einzelnen Wert zurückgeben

if EXISTS (SELECT 1 FROM [Agenda].[dbo].[System_Opened_Orders] 
    WHERE [email protected]) 
     BEGIN 
      select 1 
     END 
    ELSE 
     BEGIN 
      -- Order is not openend, get custommer data 
      select ID, OrderNumber, CustommerName, CustommerCity 
      FROM [Agenda].[dbo].[orders] where OrderNumber = @sqlordernr 
     END 

Jetzt können Sie den Unterschied zwischen den beiden Ergebnissen sagen in der Unterkunft suchen FieldCount des Datareader

using (SqlDataReader reader = command.ExecuteReader()) 
{ 
    if (reader.FieldCount == 1) 
     MessageBox.Show("Order open"); 
    else 
    { 
     while(reader.Read()) 
     { 
      // String OrderCustommerName = reader.GetString(3).TrimEnd(); 
      // String OrderCustommerCity= reader.GetString(4).TrimEnd(); 
      // lbOrderData.Text = OrderCustommerName + " " + OrderCustommerCity; 
     } 
    } 
} 
2

Sie brauchen nichts, wenn "wählen um geöffnet“

IF EXISTS (SELECT 1 FROM [Agenda].[dbo].[System_Opened_Orders] WHERE [email protected]) 
BEGIN 
    -- Order is not openend, get custommer data 
    select ID, OrderNumber, CustommerName, CustommerCity 
    FROM [Agenda].[dbo].[orders] where OrderNumber = @sqlordernr 
END 

Und dann Code auf dieser Seite; wenn es keine Zeile in Datareader, wird while.Read() geben falsch

using (SqlDataReader reader = command.ExecuteReader()) 
{ 
    while(reader.Read()) 
    { 
     // String OrderCustommerName = reader.GetString(3).TrimEnd(); 
     // String OrderCustommerCity= reader.GetString(4).TrimEnd(); 
     // lbOrderData.Text = OrderCustommerName + " " + OrderCustommerCity; 
    } 
} 
+0

Vielen Dank, sehr einfach, aber in meinem Fall ist es besser, die 'Select 1' zu verwenden – nordscan

Verwandte Themen