база данных запросов данных на каждой строке - PullRequest
1 голос
/ 24 июня 2011

У меня есть класс соединения laki это:

 public static OleDbConnection connection = new OleDbConnection();
    public string sorgu;
    public static string server;
    public static string userId;
    public static string catalog;
    public static string password;
    public DataSet ds = new DataSet();

    public bool Open()
    {
        try
        {
            if (connection.State != ConnectionState.Open)
            {

                connection.ConnectionString = "Provider=SQLOLEDB.1" +
                                               ";Password=" + password +
                                               ";Persist Security Info=True" +
                                               ";User ID=" + userId +
                                               ";Initial Catalog=" + catalog +
                                               ";Data Source=" + server;

                connection.Open();
                return true;
            }
            else
            {                    
                return true;
            }                   


        }
        catch (Exception ex)
        {
            MessageBox.Show("Sistem Mesajı:" + ex.Message, "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return false;
        }

    }


    public void CloseConnection()
    {
        if (connection.State == ConnectionState.Open)
        {
            connection.Close();
        }

    }


    public DataTable Dt(string query)
    {

        DataTable dt = new DataTable();
        if (Open())
        {
            OleDbDataAdapter da = new OleDbDataAdapter(query, connection);
            try
            {
                da.Fill(dt);

            }
            catch (Exception ex)
            {
                MessageBox.Show("Sistem Mesajı:" + ex.Message, "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        //baglanti.Close();
        return dt;


    }

, и это мой код, который я получаю значения в форме окна

ConnectionClassOleDb cc = new ConnectionClassOleDb();
sorgu = " SELECT * FROM tblFiyatlandirma WHERE " +
                    " musteriNo=" + musteriNo +
                    " AND musteriTipId=" + musteriTipId;

            nudSiparisMetresi.Value = Convert.ToDecimal(cc.Dt(sorgu).Rows[0]["siparisMetresi"]);
            nudKar.Value = Convert.ToDecimal(cc.Dt(sorgu).Rows[0]["kar"]);
            nudKumasEni.Value = Convert.ToDecimal(cc.Dt(sorgu).Rows[0]["kumasEni"]);
            nudMamulFire.Value = Convert.ToDecimal(cc.Dt(sorgu).Rows[0]["mamulFire"]);
            nudMamulKumasKari.Value = Convert.ToDecimal(cc.Dt(sorgu).Rows[0]["mamulKumasKar"]);
            nudNakliyeUcreti.Value = Convert.ToDecimal(cc.Dt(sorgu).Rows[0]["nakliye"]);
            nudKomisyon.Value = Convert.ToDecimal(cc.Dt(sorgu).Rows[0]["komisyon"]);
            nudTarakEni.Value = Convert.ToDecimal(cc.Dt(sorgu).Rows[0]["tarakEni"]);
            nudTarakNo.Value = Convert.ToDecimal(cc.Dt(sorgu).Rows[0]["tarakNo"]);
            nudTarakGecisi.Value = Convert.ToDecimal(cc.Dt(sorgu).Rows[0]["tarakGecisi"]);
            nudAtkiFiyat.Value = Convert.ToDecimal(cc.Dt(sorgu).Rows[0]["atkiFiyati"]);
            nudAtkiSikligi.Value = Convert.ToDecimal(cc.Dt(sorgu).Rows[0]["atkiSikligi"]);
            nudAnalizNo.Value = Convert.ToDecimal(cc.Dt(sorgu).Rows[0]["analizNo"]);

коды работают, но в каждомcc.Dt (sorgu) .Rows [0] row cc clas снова собирается в класс соединений и выполняет новый запрос.что не так?

Ответы [ 2 ]

1 голос
/ 24 июня 2011

Потому что каждый раз, когда вы вызываете 'Dt', вы создаете новую таблицу данных и адаптер и заполняете таблицу данными адаптером. Это приведет к выполнению запроса при каждом вызове.

Вы должны хранить возвращенный DataTable в локальной переменной и выполнять с ним операции, подобные 'Rows', вместо того, чтобы каждый раз вызывать ваш класс DB.

Итак:

DataTable dt = cc.Dt(sorgu);

и затем используйте

dt.Rows[0]["siparisMetresi"]

вместо

cc.Dt(sorgu).Rows[0]["siparisMetresi"]
0 голосов
/ 24 июня 2011

Я нахожу DataAdapters ужасно непредсказуемым, и держу пари, что это ваша проблема.

Я бы вместо этого свернул ваш DataTable из соединения, получив считыватель и преобразовав его в таблицу.Я нашел этот код в сети около 5 лет назад и до сих пор использую его каждый раз (ConvertSqlDataReaderToDataTable).Код ниже показывает, как это назвать.Вы должны быть в состоянии изменить ваши потребности очень легко.Однако, если вы проходите только один раз, не создавайте DataTable, а просто используйте DataReader.


        public static DataTable ConvertSqlDataReaderToDataTable(SqlDataReader reader)
        {
            ArrayList alColumns;
            DataColumn dcColumn;
            DataRow drRow;
            DataTable dtTemp;
            DataTable dtReturn;
            Int32 i;</p>

        // create dataset to match the reader using reader's schema
        alColumns = new ArrayList();
        dtReturn = new DataTable();
        dtTemp = reader.GetSchemaTable();
        for (i = 0; i < dtTemp.Rows.Count; i++)
        {
            dcColumn = new DataColumn();
            if (!dtReturn.Columns.Contains(dtTemp.Rows[i]["ColumnName"].ToString()))
            {
                dcColumn.ColumnName = dtTemp.Rows[i]["ColumnName"].ToString();
                dcColumn.Unique = Convert.ToBoolean(dtTemp.Rows[i]["IsUnique"]);
                dcColumn.AllowDBNull = Convert.ToBoolean(dtTemp.Rows[i]["AllowDBNull"]);
                dcColumn.ReadOnly = Convert.ToBoolean(dtTemp.Rows[i]["IsReadOnly"]);
                alColumns.Add(dcColumn.ColumnName);
                dtReturn.Columns.Add(dcColumn);
            }
        }

        // read data into the dataset
        while (reader.Read())
        {
            drRow = dtReturn.NewRow();
            for (i = 0; i < alColumns.Count; i++)
            {
                drRow[alColumns[i].ToString()] = reader[alColumns[i].ToString()];
            }
            dtReturn.Rows.Add(drRow);
        }
        return dtReturn;
    }

    public static DataTable GetTable()
    {
        DataTable dtReturn;
        SqlConnection connection = new SqlConnection(global::Project.Properties.Settings.Default.DBConnection);
        SqlCommand command;
        SqlDataReader reader;

        try
        {
            connection.Open();

            command = new SqlCommand("SELECT * FROM Table", connection);
            command.CommandType = CommandType.Text;
            reader = command.ExecuteReader(CommandBehavior.SingleResult);
            dtReturn = ConvertSqlDataReaderToDataTable(reader);
            dtReturn.TableName = command.CommandText;
            reader.Close();
        }
        catch (Exception e)
        {
            // ADD ERROR HANDLING HERE
            dtReturn = new DataTable();
        }
        finally
        {
            connection.Close();                
        }

        return dtReturn;
    }

...