2013-07-29 12 views
5

Próbuję utworzyć przygotowane oświadczenie w języku C#.C# oracle sql przygotowane oświadczenie

Z jakiegoś powodu wszystko, co próbuję, kończy się wyjątkiem.

*. To jest mój kod na teraz:

Wyjątkiem, który otrzymuję jest: "Operacja nie jest ważna z powodu bieżącego stanu obiektu."

using (OracleCommand cmd = new OracleCommand()) 
    { 
     cmd.Connection = conn; 
     cmd.CommandType = CommandType.Text; 

     cmd.CommandText = "insert into daily_cdr_logs " + 
       "(message) " + 
       "values " + 
       "(:message)"; 

     cmd.Parameters.Add(:message, msg); 
     //OracleDbType.Int32, postpaid_duration, ParameterDirection.Input); 
     cmd.Prepare(); 
     cmd.ExecuteNonQuery(); 
    } 
  • Widziałem kilka osób robi to z Parameters.AddWithValue. ale z jakiegoś powodu nie mogę znaleźć AddWithValue funkcji w OracleCommand.Parameters, mam importowane Oracle.DataAccess.Client i mam oracle DataAccess refferance, Visual Studio 2010.
+0

Czy wcześniej otworzyłeś połączenie? – Steve

+2

Nie pytałeś tego wcześniej? http: // stackoverflow.com/questions/17921492/c-sharp-equivalent-to-java-prepared-statement –

+0

Wyjątek jest zgłaszany przez linię Prepare lub przez linię ExecuteNonQuery? – Steve

Odpowiedz

0

Połączenie musi być otwarty przed wywołaniem cmd.ExecuteNonQuery().

Spróbuj tego:

cmd.Connection.Open(); 
cmd.ExecuteNonQuery(); 
+2

połączenie jest otwarte – susparsy

0

Spróbuj w ten sposób:

using (OracleCommand cmd = new OracleCommand()) 
    { 
     cmd.Connection = conn; 
     cmd.CommandType = CommandType.Text; 

     cmd.CommandText = "insert into daily_cdr_logs " + 
       "(message) " + 
       "values " + 
       "(:message)"; 

     OracleParameter pMsg = new OracleParameter("message",OracleDbType.Varchar2); 
      pMsg.Value = msg; 

     cmd.Parameters.Add(pMsg); 

     //OracleDbType.Int32, postpaid_duration, ParameterDirection.Input); 
     cmd.Prepare(); 
     cmd.ExecuteNonQuery(); 
    } 
+0

DbType.Varchar; nie istnieje, może oracledbtypes? – susparsy

+0

@susparsy Może 'Varchar2'? Zmieniłem odpowiedź. – Parado

3

Ogólną zasadą jest otwarty tylko połączenie w razie potrzeby i blisko/wyrzucać go tak szybko, jak skończysz. Pula połączeń jest zarządzana automatycznie, więc otwarcie nowego połączenia nie jest ciężkim zadaniem. Gdy otworzysz połączenie, zamkniesz je i ponownie otworzysz to samo połączenie, nowe połączenie natywne tak naprawdę nie zostanie utworzone. Poprzednia jest pobierana z puli połączeń. Wartości domyślne są zazwyczaj w porządku, więc nie polecam przepuszczania elementów podczas tworzenia połączenia. Jeśli wykonujesz 10 poleceń z rzędu, otwórz połączenie, wykonaj 10 poleceń i zamknij je. Zrób to tylko wtedy, gdy są zobowiązani do wykonania egzekucji jeden po drugim i nie "trzymasz się" połączeń podczas wykonywania innych czynności. Jeśli chcesz zrobić coś innego, zamknij połączenie, zanim to zrobisz. Zwykle daje to najlepszą wydajność.

Prawie. Spróbuj:

cmd = new command(...); 
cmd.parameters.Add(...) 
cmd.parameters.Add(...) 

następnie connection.open() // wykonać polecenie i wykorzystania wyników

0

Wersja SQL Server polecenia Przygotuj wymaga

Zanim zadzwonisz Przygotować należy określić typ danych każdego parametru w oświadczenie, które należy przygotować. Dla każdego parametru o zmiennej długości typu danych należy ustawić właściwość Rozmiar na wymagany rozmiar maksymalny: . Przygotuj zwraca błąd, jeśli te warunki nie są spełnione

Ponieważ polecenie Przygotuj jest zdefiniowana w klasie IDbCommand i dziedziczone przez innych klas ADO.NET Przypuszczam, że jest to prawdą również dla Oracle, zatem należy dodać następujące linie dodaj parametr do swojego polecenia (i upewnij się, że połączenie jest już otwarte podczas wywoływania funkcji Przygotuj).

cmd.CommandText = "insert into daily_cdr_logs (message) " + 
        "values (:message)"; 
OracleParameter p = new OracleParameter(":message", DbType.Varchar); 
p.Size = 2000; // as a wild guess 
p.Value = msg; 
cmd.Parameters.Add(p); 
cmd.Prepare(); 
cmd.ExecuteNonQuery(); 
Powiązane problemy