我的数据库是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?还是我的代码中还缺少某些东西?
答案 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}}
要确保此错误与您的代码无关,请在运行程序之前截断表格(清空表格!)。