【问题标题】:datatable request database on every row每行上的datatable请求数据库
【发布时间】:2011-06-24 11:27:51
【问题描述】:

我有一个连接类 laki this:

 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] 行中,cc clas 将再次进入连接类并执行新查询。怎么了?

【问题讨论】:

    标签: c# sql .net-3.5 datatable


    【解决方案1】:

    因为每次调用“Dt”时,都会创建一个新的数据表和适配器,并用适配器填充数据表。这将导致在每次调用时执行查询。

    您应该将返回的 DataTable 存储在一个局部变量中,并对其执行“行”之类的操作,而不是每次都调用您的 DB 类。

    所以:

    DataTable dt = cc.Dt(sorgu);
    

    然后使用

    dt.Rows[0]["siparisMetresi"]
    

    而不是

    cc.Dt(sorgu).Rows[0]["siparisMetresi"]
    

    【讨论】:

      【解决方案2】:

      我发现 DataAdapters 非常难以预测,我敢打赌这是你的问题。

      我会通过获取阅读器并转换为表格来从连接中包装您的 DataTable。大约5年前我在网上找到了这段代码,并且每次都使用它(ConvertSqlDataReaderToDataTable)。下面的代码显示了如何调用它。您应该能够很容易地根据您的需要进行修改。但是,如果只通过一次,就不要创建DataTable,而是使用DataReader。

      
              public static DataTable ConvertSqlDataReaderToDataTable(SqlDataReader reader)
              {
                  ArrayList alColumns;
                  DataColumn dcColumn;
                  DataRow drRow;
                  DataTable dtTemp;
                  DataTable dtReturn;
                  Int32 i;
      
              // 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;
          }
      

      【讨论】:

        猜你喜欢
        • 2010-12-03
        • 2017-06-30
        • 2010-10-27
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多