使用DataSet到Datagridview显示数据库项,从分离的类到winform

时间:2014-01-05 06:15:17

标签: c# mysql winforms datagridview

我的数据库是mysql。 我尝试使用DataSet将数据库项加载到datagridview。在这里,我有一个DBConnect.cs类,在另一个项目中,在同一个解决方案中看起来像这样。

#region properties
public string property_sDataMember { get; set; }
#endregion

public void Select()
{
    #region fields
    string sqlQuery;
    DataSet ds = new DataSet();
    #endregion

    #region initiate
    data = new MySqlDataAdapter();
    #endregion

    #region SQL Queries
    sqlQuery = "SELECT Number, Name, Gender, Age, Additional FROM master";
    #endregion

    #region execute
    if (this.OpenConnection() == true)
    {
        cmd = new MySqlCommand(sqlQuery, connect);
        data.SelectCommand = cmd;
        data.Fill(ds, property_sDataMember);

        cmd.ExecuteNonQuery();
        CloseConnection();
    }

    #endregion
}

然后我将从WinForm访问该类,我在另一个项目和同一解决方案中将其命名为“Report”。这是我的报告代码

private void btn_SelectAll_Click(object sender, EventArgs e)
{
    DataSet ds = new DataSet();

    #region access properties
    clsDBConnect.property_sDataMember = "Result";
    #endregion

    clsDBConnect.Select();

    datagridview1.DataSource = ds;
    datagridview1.DataMember = clsDBConnect.property_sDataMember;
}

但是当我执行按钮时,我得到“无法将MySQL日期/时间值转换为System.DateTime。如何在数据库中的每个项目显示到datagridview之前格式化值? 是我的代码选择所有项目是对的?我现在对自己的逻辑感到困惑。我真的不知道如何将数据库添加到DataSet,它有自己的类与WinForm分开。

填充我的代码后

这是我的DBConnect.cs(在不同的项目中但在相同的解决方案中)

public DataSet Select()
{
    #region fields
    string sqlQuery;
    DataSet ds = new DataSet();
    MySqlDataAdapter dataAdapter = new MySqlDataAdapter();
    #endregion

    #region SQL Queries
    sqlQuery = "SELECT NoNota, Nama, Tanggal, Tipe, Keterangan FROM master";
    #endregion

    #region execute
    if (this.OpenConnection() == true)
    {
        cmd = new MySqlCommand(sqlQuery, connect);
        dataAdapter.SelectCommand = cmd;
        dataAdapter.Fill(ds, "Master");
        dataAdapter.Dispose();
        CloseConnection();
    }
    #endregion

    return ds;
}

这是我的Form1.cs(在不同的项目中但在同一个解决方案中)

private void btn_Tampil_Click(object sender, EventArgs e)
{
    clsDBConnect = new DBConnect.DBConnect();

    dgv_laporan.DataSource = clsDBConnect.Select();
    dgv_laporan.DataMember = "Master";

} 

当我执行按钮时,它仍然给我一个错误,上面写着“无法将MySQL日期/时间转换为System.DateTime。这意味着我必须格式化包含MySQL日期/时间的数据库列格式类型System.DateTime?还是我的代码中还缺少某些东西?

1 个答案:

答案 0 :(得分:3)

在您的按钮事件处理程序中,您创建了一个名为ds的变量,但我没有看到您何时使用数据填充DataSet。要获得更好的答案,您应该发布可重现的代码。

如果您的问题与班级互动有关,这是可能的解决方案之一。假设您有一个名为Database的类,其代码如下:

class Database
{
   public DataSet GetData()
   {
      string connStr = "server=localhost;user=steven;password=12345;database=exercises;";
      MySqlConnection conn = new MySqlConnection(connStr);
      DataSet result = new DataSet();
      try
      {
         conn.Open();
         MySqlDataAdapter reader = new MySqlDataAdapter("SELECT * FROM invoice", conn);
         reader.Fill(result, "invoice");
      }
      catch
      {
         // error handling here
      }
      finally
      {
        conn.Close();
      }
      return result;
   }
}

Database.GetData()将返回DataSet可供DataGridView使用的public partial class Form1 : Form { ... private void button1_Click(object sender, EventArgs e) { Database db = new Database(); dataGridView1.DataSource = db.GetData(); dataGridView1.DataMember = "invoice"; } } 。例如,在表单中,您可以创建按钮事件处理程序,如:

Database

如果要共享Form1类的实例(对象),可以将其设为public partial class Form1 : Form { private Database db = new Database(); ... private void button1_Click(object sender, EventArgs e) { dataGridView1.DataSource = db.GetData(); dataGridView1.DataMember = "invoice"; } } 类的私有成员,例如:

Unable to convert MySQL date/time value to System.DateTime

date

相关的更新

此异常是由表中的错误数据引起的。检查表中SELECT Tanggal FROM master WHERE Tanggal = 0; 个字段中的任何一个是无效日期,例如'0000-00-00'。您可以发出以下查询以进行快速检查:

date

将无效的NULL替换为有效的UPDATE master SET Tanggal = NULL WHERE Tanggal = 0; 值。例如,要将所有0日期字段替换为NULL,请使用以下查询:

{{1}}

要确保此错误与您的代码无关,请在运行程序之前截断表格(清空表格!)。