ExecuteNonQuery не выполняется - vb.net - PullRequest
1 голос
/ 08 октября 2009

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

    ''#...
    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

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

Спасибо

Ответы [ 6 ]

1 голос
/ 09 октября 2009

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

1 голос
/ 08 октября 2009

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

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

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

1 голос
/ 08 октября 2009

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

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

1 голос
/ 08 октября 2009

Ваш код выглядит нормально, вы можете показать нам оператор 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();
        }
    }
1 голос
/ 08 октября 2009

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

m_objConnection

Ради отладки вы можете прокомментировать оператор try / catch. ИМО

0 голосов
/ 13 октября 2009

Visual Studio создает копию файл базы данных, добавляет его в свой проект и изменяет соединение так что теперь он указывает на базу данных в вашем проекте.

http://msdn.microsoft.com/en-us/library/ms246989%28VS.80%29.aspx

...