2012-07-23 20 views
5

Tutaj tworzę tabelę w bazie danych dynamicznie. Użytkownik wprowadza nazwę jako swoje życzenie i wybiera radiobutton języka. Tak więc problem jest po wykonaniu cmd.ExecuteNonQuery wartość i integer idzie od -1 z 0. I pokazuje, że tabela nie mogła zostać utworzona, ale kiedy idę do bazy danych jej już pomyślnie utworzony. Daj mi znać, co robię źle. Thanx z wyprzedzeniem !!cmd.ExecuteNonQuery wartość i integer wynosi -1 od 0

protected void btnpaper_Click(object sender, EventArgs e) 
    { 
     try 
     {     
       string conn = ConfigurationManager.ConnectionStrings["sqlconn"].ConnectionString; 
       SqlConnection con = new SqlConnection(conn); 
       con.Open(); 
       char[] arr = new char[] {'n','g','l','i','s','h'}; 
       string str = "CREATE TABLE " + Label1.Text.Trim() + 
          txtpaperset.Text.Trim()+ rbtnEng.Text.TrimEnd(arr) + 
          "(" + "quesNo int NOT NULL PRIMARY KEY, " + 
          "question varchar(1000) NOT NULL," + 
          "ansA varchar(500) NOT NULL, " + 
          "ansB varchar(500) NOT NULL, " + 
          "ansC varchar(500) NOT NULL, " + 
          "ansD varchar(500) NOT NULL, " + 
          "rightAns varchar(50) NOT NULL " + ")";      
       SqlCommand cmd = new SqlCommand(str, con); 
       int i = cmd.ExecuteNonQuery(); 
       if (i > 0) 
       { 
        lblerrormsg.Visible = true; 
        con.Close(); 
       } 
       else 
       { 
        lblerrormsg.Text = "Table Not Created Please Try with Different Name!";       
        con.Close(); 
       }     

     } 
     catch (System.Exception excep) 
     { 
      MessageBox.Show(excep.Message); 
     }  
    } 
+1

Czy jest to zaproszenie do SQL-Injection? Użyj parametrów SQL! Poza tym, zawsze zamknij połączenie, gdy skończysz, najlepiej używając 'using-statement':' using (var con = new SqlConnection (conn)) {con.Otwarty(); // ...} '(to zamknie połączenie implicitely, nawet w przypadku wyjątku). –

+2

@TimSchmelter: Nie jestem pewien, czy sparametryzowany SQL działa dla DDL ... –

Odpowiedz

8

trwa od MSDN Uwagi na SqlCommand.ExecuteNonQuery

FOR UPDATE, INSERT i DELETE, wartość zwracana jest liczba wierszy dotkniętych przez komendę. Gdy istnieje wyzwalacz na wstawianej lub aktualizowanej tabeli , zwracana wartość zawiera liczbę wierszy, na które wpływa zarówno operacja wstawiania lub aktualizacji, jak i liczba wierszy, na które ma wpływ wyzwalacz lub wyzwalacze. W przypadku wszystkich pozostałych typów instrukcji zwracana jest wartość -1. Jeśli wystąpi wycofanie, zwracana wartość również jest równa -1.

7

Od docs dla SqlCommand.ExecuteNonQuery kopalni (nacisk):

FOR UPDATE, INSERT i DELETE, wartość zwracana jest liczba wierszy przez polecenie. Gdy istnieje wyzwalacz dla wstawianej lub aktualizowanej tabeli, wartość zwracana obejmuje liczbę wierszy, na które wpływa zarówno operacja wstawiania lub aktualizacji, jak i liczbę wierszy, na które ma wpływ wyzwalacz lub wyzwalacze. Dla wszystkich innych typów instrukcji zwracana jest wartość -1. Jeśli wystąpi wycofanie, zwracana wartość również wynosi -1.

Czy Twoje oświadczenie jest instrukcją UPDATE, INSERT lub DELETE? Nie. Stąd otrzymujesz -1.

Nie jest jasne, co masz na myśli przez wartość i zamiar -1 „z” Nigdy nie jest 0. 0. Nie ma wartość dopóki nie zostanie przypisany jeden z wyniku ExecuteNonQuery.

+0

Chcę, aby użytkownik dowiedział się, czy tworzenie tabeli odbywa się pomyślnie, czy nie. Dlatego też użyłem liczby całkowitej. Proszę o pomoc, jeśli mogę użyć innego sposobu. –

+0

@rickevans: Oczekuję, że jeśli tworzenie tabeli nie powiedzie się, otrzymasz wyjątek. Spróbuj - zobacz, co się stanie, jeśli spróbujesz odtworzyć tabelę, która już istnieje. –

0

Czy jest to zgodne z projektem?

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx

a także:

cmd.executenonquery is returning -1 in vb.net windows application

Mówisz dostajesz -1, prawda?

edit: aby odpowiedzieć na ostatnią część pytania, to zobaczyć:

Check if table exists in SQL Server

+0

Otrzymuję -1. wszystko, co chcę zrobić, to powiadomić użytkownika, że ​​tworzenie tabeli zakończyło się pomyślnie. –

+0

utworzyć dodatkowe zapytanie, aby je zweryfikować. – johnny

+0

czy możesz rozwinąć? –

-2

Public Shared Function Insert (ByVal SProcedure As String, parametry ByVal() Jako SqlParameter) As Boolean Korzystanie CNN jako Nowy SqlConnection (Emplooyes) Wypróbuj

  Dim cmd As SqlCommand = New SqlCommand(SProcedure, cnn) 
      cmd.CommandType = CommandType.StoredProcedure 
      cmd.Parameters.AddRange(parameters) 

      If cnn.State = ConnectionState.Closed Then 
       cnn.Open() 
      End If 

      Dim Ls As Integer 
      Ls= cmd.ExecuteNonQuery() 
      If Ls = -1 Then 
       Return False 
      Else 
       Return True 
      End If 

     Catch ex As Exception 
      Return False 
     Finally 
      cnn.Close() 
     End Try 
    End Using 
End Function 
+0

Witamy w Stack Overflow! Czy zastanawiałbyś się nad dodaniem jakiejś narracji, aby wyjaśnić, dlaczego ten kod działa i co sprawia, że ​​jest to odpowiedź na pytanie? Byłoby to bardzo pomocne dla osoby zadającej pytanie i dla każdego, kto się pojawi. –