2009-10-08 3 views
1

Я пытаюсь выполнить команду SQL, но я просто не могу понять, почему это не работает. Это, как я определил функцию «выполнить» в моем классе под названием «clsSQL»:ExecuteNonQuery не выполняется - vb.net

''#... 
    Private m_sConnectionString As String = String.Empty 
    ''#... 
    Friend WithEvents m_objConnection As SqlConnection 
    Friend WithEvents m_objCommand As SqlCommand 
    ''#... 

     Public Function OpenConnection() As Boolean 
      Try 
       m_objConnection = New SqlConnection(m_sConnectionString) 
       m_objConnection.Open() 
       Select Case m_objConnection.State 
        Case Data.ConnectionState.Open : Return True 
        Case Else : Return False 
       End Select 
      Catch ex As Exception 
       RaiseEvent OnError("OpenConnection", ex) 
      End Try 
     End Function 


     Public Function Execute(ByVal sQuery As String) As Boolean 
       Try 
     #If DEBUG_MODE Then 
        Debug.WriteLine(sQuery) 
     #End If 
        m_objCommand = New SqlCommand(sQuery, m_objConnection) 
        m_objCommand.ExecuteNonQuery() 
        m_objCommand = Nothing 
        Return True 
       Catch ex As Exception 
        RaiseEvent OnError("Execute", ex) 
       End Try 
      End Function 
''#.. 
''#... 

Это, как я звоню его:

 Using oSQL As New clsSQL(My.Settings.projectConnectionString) 
      If oSQL.OpenConnection Then 
       strSQL = "INSERT INTO ... blablabla..." 
       oSQL.Execute(strSQL) 
      End If 
     End Using 

код не вызывает никаких ошибок, то просто не сохраняя данные в базе данных. Ошибка не в команде SQL, я вручную проверил его;)

Например, я могу выполнить совершенно следующей функции без каких-либо проблем:

Public Function ToDataGrid(ByVal oDataGrid As DataGridView, _ 
           ByVal sQuery As String, _ 
         Optional ByVal sTable As String = "") As Boolean 
     Try 
#If DEBUG_MODE Then 
      Debug.WriteLine(sQuery) 
#End If 
      Dim objDataSet As New DataSet 
      objDataSet = ToDataSet(sQuery, sTable) 
      oDataGrid.DataSource = objDataSet.Tables(0) 
      objDataSet.Dispose() 
      objDataSet = Nothing 
      Return True 
     Catch ex As Exception 
      RaiseEvent OnError("ToDataGrid", ex) 
     End Try 
    End Function 

И это, как я м, называя это:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Using oSQL As New clsSQL(My.Settings.projectConnectionString) 
     If oSQL.OpenConnection Then 
      oSQL.ToDataGrid(Me.DataGridView, "select * from table") 
     End If 
    End Using 
End Sub 

Возможно, мне просто нужна еще одна пара глаз, потому что я не вижу, что я делаю неправильно: |

Благодаря

+0

_Please_ скажите мне, что вы не конкатенации пользовательские параметры непосредственно в переменную strSQL? Это очень плохо. Вместо этого используйте параметры запроса. –

+0

Catch: End Try - DONT SWALLOW EXCEPTIONS – wefwfwefwe

+0

@Joel: это просто жесткий SQL-запрос, без пользовательских параметров; @wefwfwefwe: fixed – RSilva

ответ

1

Я не уверен, если это является причиной ошибки, просто любопытно, где вы установите эту переменную?

m_objConnection 

Ради отладки вы можете высказать свое мнение о try/catch. IMO

+0

m_objConnection установлен в функции «OpenConnection», которую я добавил в сообщение. – RSilva

+0

Я бы сказал, используя SQL Profiler, чтобы определить, подходит ли эта вставка к вашему db. Вы можете фильтровать профилировщик только для этого имени базы данных или DBID. – JonH

1

Ваш код выглядит нормально, вы можете показать нам инструкцию INSERT. Также попробовали ли вы использовать SQL Profiler, чтобы увидеть, действительно ли ваш INSERT попадает в базу данных?

Вот класс SQL я написал некоторое время назад, что вы можете использовать:

using System; 
using System.Data.SqlClient; 

namespace SAPCommonData 
{ 
    public class SQLClass : IDisposable 
    { 
     private String connString; 
     private SqlCommand SQLCmd; 
     private SqlConnection SQLConn; 

     public void Dispose() 
     { 
      if (SQLCmd != null) 
      { 
       SQLCmd.Dispose(); 
       SQLCmd=null; 
      } 

      if (SQLConn != null) 
      { 
       SQLConn.Dispose(); 
       SQLConn = null; 
      } 
     } 
     public String SQLConnString 
     { 
      get{ return connString; } 
      set{ connString = value; } 
     } 
     private String GetSQLConnString() 
     { 
      String strConn; 

      try 
      { 
       strConn = System.Configuration.ConfigurationSettings.AppSettings.Get("SQL_CONN"); 
      } 

      catch (Exception ex) 
      { 
      throw (new System.Exception(ex.Message.ToString())); 
      } 

      return strConn; 
     } 
     public void SQLExecuteNonQuery() 
     { 
      if (SQLCmd == null) 
      { 
       throw (new System.Exception("Must use SetSQLCommand to initialize SQLCommand object!"));  
      } 

      if (SQLConn == null) 
      { 
       OpenSQLDB(); 
      } 

      try 
      { 
       SQLCmd.ExecuteNonQuery(); 
      } 
      catch (Exception ex) 
      { 
       throw (new System.Exception(ex.Message.ToString())); 
      } 
      finally 
      { 
       SQLCmd.Dispose(); 
       SQLCmd=null; 
      } 
     } 
     public SQLClass() 
     {   
      try { 
       connString = GetSQLConnString(); 
       } 
       catch (Exception e) 
       { 
       throw new System.Exception(e.Message.ToString()); 
       } 
      try 
      { 
       SQLConn = new SqlConnection(connString); 
       SQLConn.Open(); 
      } 
      catch (Exception e) 
      { 
       throw (new System.Exception(e.Message.ToString())); 
      }  
     } 
     public void OpenSQLDB() 
     { 
      if (IsOpen()) 
      { 
       //connection state open already 
      } 
      else 
      { 
       if (connString.Length == 0) 
       { 
        try 
        { 
         connString = GetSQLConnString(); 
        } 
        catch (Exception e) 
        { 
         throw new System.Exception(e.Message.ToString()); 
        } 
       } 

       try 
       { 
        SQLConn = new SqlConnection(connString); 
        SQLConn.Open(); 
       } 
       catch (Exception e) 
       { 
        throw (new System.Exception(e.Message.ToString())); 
       } 
      } 
     } 
     public bool IsOpen() 
     { 
      return (SQLConn.State == System.Data.ConnectionState.Open); 
     } 
     public void CloseSQLDB() 
     { 
      if (IsOpen()) 
      { 
       SQLConn.Dispose(); 
       SQLConn.Close(); 
       SQLConn=null; 
      } 
     } 
     public String SQLDBUsed() 
     { 
      return SQLConn.Database; 
     } 
     public void SetSQLCommand(String proc) 
     { 
      if (proc.Length == 0) 
      { 
       throw new System.Exception("Procedure must be specified when calling SetSQLCommand!"); 
      } 

      if (SQLConn == null) 
      { 
       OpenSQLDB(); 
      } 

      SQLCmd = new SqlCommand(proc, SQLConn); 
      SQLCmd.CommandType = System.Data.CommandType.StoredProcedure; 
     } 
     public void AddSQLCmdParameter(String pName, System.Data.SqlDbType pType, object pVal) 
     { 
      if (SQLCmd == null) 
      { 
       throw (new System.Exception("Must use SetSQLCommand to initialize SQLCommand object!"));   
      } 

      if (SQLConn == null) 
      { 
       OpenSQLDB();  
      } 

      try 
      { 
       SQLCmd.Parameters.Add(pName, pType).Value = pVal; 
      } 
      catch (Exception ex) 
      { 
       throw (new System.Exception(ex.Message.ToString())); 
      } 
     } 
     public void ClearSQLCmdParameters() 
     { 
      if (SQLCmd != null) 
      { 
       SQLCmd.Parameters.Clear(); 
      } 
     } 
     public void DisposeSQLCmd() 
     { 
      if (SQLCmd != null) 
      { 
       SQLCmd.Dispose(); 
      } 
     } 
     public System.Data.SqlClient.SqlDataReader SQLExecuteReader() 
     { 
      System.Data.SqlClient.SqlDataReader dr; 

      if (SQLCmd == null) 
      { 
       throw (new System.Exception("Must use SetSQLCommand to initialize SQLCommand object!"));  
      } 

      if (SQLConn == null) 
      { 
       OpenSQLDB(); 
      } 

      try 
      { 
       dr = SQLCmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection); 
      } 
      catch (Exception ex) 
      { 
       throw (new System.Exception(ex.Message.ToString())); 
      } 
      finally 
      { 
       SQLCmd.Dispose(); 
       SQLCmd=null; 
      } 
      return dr; 
     } 
    } 
} 

Затем вы можете использовать этот объект, например, так:

public void ProcessCustomerData(DataTable dt) 
    { 
     //we have a valid connection to the database 
     if (dt.Rows.Count > 0) 
     { 
      try 
      { 
       s=new SQLClass();   
      } 
      catch (Exception e) 
      { 
       throw new System.Exception(e.Message.ToString()); 
      } 
      foreach(DataRow dr in dt.Rows) 
      { 
       tw.WriteLine("Processing customer: " + dr["NAME1"].ToString()); 
       Console.WriteLine("Processing customer: " + dr["NAME1"].ToString()); 
       s.SetSQLCommand("insCustomer"); 
       s.AddSQLCmdParameter("@ClientID", System.Data.SqlDbType.Int, dr["MANDT"]); 
       s.AddSQLCmdParameter("@CustomerID", System.Data.SqlDbType.BigInt, dr["KUNNR"]); 
       s.AddSQLCmdParameter("@CustomerName1", System.Data.SqlDbType.VarChar, ((string)dr["NAME1"]==String.Empty ? DBNull.Value : dr["NAME1"])); 
       s.AddSQLCmdParameter("@CustomerName2", System.Data.SqlDbType.VarChar, ((string)dr["NAME2"]==String.Empty ? DBNull.Value : dr["NAME2"])); 
       s.AddSQLCmdParameter("@Country", System.Data.SqlDbType.VarChar, ((string)dr["LAND1"]==String.Empty ? DBNull.Value : dr["LAND1"])); 
       s.AddSQLCmdParameter("@Region", System.Data.SqlDbType.VarChar, ((string)dr["REGIO"]==String.Empty ? DBNull.Value : dr["REGIO"])); 
       s.AddSQLCmdParameter("@City", System.Data.SqlDbType.VarChar, ((string)dr["ORT01"]==String.Empty ? DBNull.Value : dr["ORT01"])); 
       s.AddSQLCmdParameter("@ZipCode", System.Data.SqlDbType.VarChar, ((string)dr["PSTLZ"]==String.Empty ? DBNull.Value : dr["PSTLZ"])); 
       s.AddSQLCmdParameter("@Address", System.Data.SqlDbType.VarChar, ((string)dr["STRAS"]==String.Empty ? DBNull.Value : dr["STRAS"])); 
       s.AddSQLCmdParameter("@Telephone", System.Data.SqlDbType.VarChar, ((string)dr["TELF1"]==String.Empty ? DBNull.Value : dr["TELF1"])); 
       s.AddSQLCmdParameter("@Fax", System.Data.SqlDbType.VarChar, ((string)dr["TELFX"]==String.Empty ? DBNull.Value : dr["TELFX"])); 
       s.AddSQLCmdParameter("@DateAdded", System.Data.SqlDbType.DateTime, System.DateTime.Today); 
       s.AddSQLCmdParameter("@DateModified", System.Data.SqlDbType.DateTime, System.DateTime.Today); 
       s.AddSQLCmdParameter("@AddedBy", System.Data.SqlDbType.VarChar, DBNull.Value); 
       s.AddSQLCmdParameter("@ModifiedBy", System.Data.SqlDbType.VarChar, DBNull.Value); 
       s.SQLExecuteNonQuery(); 
       Console.WriteLine("Processed customer: " + dr["NAME1"].ToString()); 
       tw.WriteLine("Processed customer: " + dr["NAME1"].ToString()); 
      } 
      s.CloseSQLDB(); 
      s.Dispose(); 
     } 
    } 
+0

Я попробую. спасибо – RSilva

1

ли Catch : End Try в OpenConnection маскирования исключение и скрывать тот факт, что вы никогда не подключаетесь к базе данных и поэтому никогда не выполняете SQL?

Кроме того, это не похоже, что вы когда-либо закрываете соединение.

+0

Я исправил это, и ошибка не возникла. спасибо – RSilva

1

Я предполагаю, что существует условие для оператора SQL, предотвращающего возникновение вставки.

Учитывая, что исключений не выбрасывают, я бы поставил реальные деньги, которые фактически обрабатываются, но предложение WHERE предотвращает вставку любых строк.

Я бы посмотрел на это.

+0

нет условия для оператора SQL. является простой инструкцией Insert. – RSilva

1

Где ваша функция New() в вашем классе? Можете ли вы отлаживать m_sConnectionString из своей функции OpenConnection() в своем классе? Получаете ли вы возвращаемое значение True из этой функции? У вас нет предложения «Else» в случае сбоя вашего oSQL.OpenConnection, поэтому вы действительно не знаете, подключаетесь ли вы.

+0

Я предполагаю, что это, по крайней мере, вызовет исключение, которое увидит Try..Catch. Сожалею. Это пятница, и кофе не помогает. – sentry07

+0

OpenConnection() возвращает True, а connectionString - это то, что я искал (правильно). спасибо в любом случае – RSilva

Смежные вопросы