最近在做一个窗体应用项目,简单记下过程中遇到的关于Access数据调用的一些问题点和一些弯路
Winform对于Access的调用对于数据存储和一些数据操作确实比较非常方便,一些常用的Sql语句也比较能够很好得适应和使用,比如:
string.Format("select * from TableName);//查找获取数据表TableName
string.Format("select * from TableName where SchKey like '% value %'");//在数据表TableName查找特定列SchKey特定值value
string.Format("select distinct ColumnName from TableName");//查找数据表TableName下列ColumnName的集合
。。。等等,可以参考SQL绝大部分语句进行测试
这里要注意的是,在时间区间查找操作时,需要注意,Access语句需在时间量两侧添加上“#”,代码如下:
string.Format("select * from TableName where DateTimeColumnName between #" + dateTimePicker1.Value.ToString("yyyy/MM/dd 00:00:00") + "# and #" + dateTimePicker2.Value.ToString("yyyy/MM/dd 23:59:59") + "#");//查找数据表TableName时间列DateTimeColumnName中数值在一定范围内的DataTable集合
其中,用的是between…and…句式,同样,>=…and <=…也同样适用,这里比较日期/时间需要涉及到时间,采用between…and…更为方便。
数据表的Excel输出,代码如下:
SaveFileDialog saveFile = new SaveFileDialog();
saveFile.Filter = ("Excel 文件(*.xls)|*.xls");//指定文件后缀名为Excel 文件。
if (saveFile.ShowDialog() == DialogResult.OK)
{
string filename = saveFile.FileName;
if (System.IO.File.Exists(filename))
{
System.IO.File.Delete(filename);//如果文件存在删除文件。
}
int index = filename.LastIndexOf("//");//获取最后一个/的索引
filename = filename.Substring(index + 1);//获取excel名称(新建表的路径相对于SaveFileDialog的路径)
//select * into 建立 新的表。
//[[Excel 8.0;database= excel名].[sheet名] 如果是新建sheet表不能加$,如果向sheet里插入数据要加$.
//sheet最多存储65535条数据。
string sql = "select top 65535 * into [Excel 8.0;database=" + filename + "].[用户信息] from SilkType";
if (Db.GetState(@sql) > 0)
{
MessageBox.Show("导出数据成功", "导出数据", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
这里用的是网友贴的代码,导出Excel代码,简单快速,很好用。
关于WinForm上对于Access的应用内容还有很多有待研究,暂且记下这些,也方便以后查看。
最后贴下七拼八凑的Access语句使用的类码,写成类的好处很方便调用,如下类码:
class SQL
{
OleDbConnection conn = null;
OleDbCommand cmd = null;
/// <summary>
/// 带参的构造函数
/// </summary>
/// <param name="path"></param>
public SQL(string path)
{
conn = new OleDbConnection();
//conn.ConnectionString = "initial catalog=pubs;data source=.;user id=sa;password=";
//conn.ConnectionString = Convert.ToString(System.Configuration.ConfigurationSettings.AppSettings["datasource"]);
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + @path + ";Persist Security Info=True";//path为Access数据表存放路径,可采用注册表形式,这里不细说了
cmd = new OleDbCommand();
cmd.Connection = conn;
}
public DataTable GetTable(string OleDb)
{
DataSet ds = new DataSet();
try
{
cmd.CommandText = OleDb;
OleDbDataAdapter da = new OleDbDataAdapter();
da.SelectCommand = cmd;
da.Fill(ds);
}
catch (Exception ex)
{
this.ShowError(ex.Message);
return null;
}
return ds.Tables[0] ?? new DataTable();
}
/// <summary>
/// 获取数据根据OleDb语句 带参数 的
/// </summary>
/// <param name="OleDb"></param>
/// <param name="pas"></param>
/// <returns></returns>
public DataTable GetTable(string OleDb, params OleDbParameter[] pas)
{
DataSet ds = new DataSet();
try
{
cmd.CommandText = OleDb;
OleDbDataAdapter da = new OleDbDataAdapter();
da.SelectCommand = cmd;
cmd.Parameters.Clear();
foreach (OleDbParameter temppa in pas)
{
cmd.Parameters.Add(temppa);
}
da.Fill(ds);
}
catch (Exception ex)
{
this.ShowError(ex.Message);
return null;
}
return ds.Tables[0] ?? new DataTable();
}
/// <summary>
/// 根据OleDb语句返回跟新状态
/// </summary>
/// <param name="OleDb"></param>
/// <returns></returns>
public int GetState(string OleDb)
{
int succ = 0;
try
{
cmd.CommandText = OleDb;
conn.Open();
succ = cmd.ExecuteNonQuery();
conn.Close();
}
catch (Exception ex)
{
this.ShowError(ex.Message);
}
return succ;
}
/// <summary>
/// 根据OleDb语句返回跟新状态带参数的
/// </summary>
/// <param name="OleDb">OleDb语句</param>
/// <param name="pas">参数的集合</param>
/// <returns></returns>
public bool GetState(string OleDb, params OleDbParameter[] pas)
{
bool succ = false;
try
{
cmd.CommandText = OleDb;
cmd.Parameters.Clear();
foreach (OleDbParameter temppa in pas)
{
cmd.Parameters.Add(temppa);
}
conn.Open();
succ = cmd.ExecuteNonQuery() > 0 ? (true) : (false);
conn.Close();
}
catch (Exception ex)
{
this.ShowError(ex.Message);
return false;
}
return succ;
}
/// <summary>
/// 根据OleDb语句返回第一个单元格的数据
/// </summary>
/// <param name="OleDb"></param>
/// <returns></returns>
public string GetOne(string OleDb)
{
string res = "";
try
{
cmd.CommandText = OleDb;
conn.Open();
res = cmd.ExecuteScalar() == null ? ("") : (Convert.ToString(cmd.ExecuteScalar()));
conn.Close();
}
catch (Exception ex)
{
this.ShowError(ex.Message);
return null;
}
return res;
}
/// <summary>
/// 根据OleDb语句返回第一个单元格的数据带参数的
/// </summary>
/// <param name="OleDb"></param>
/// <param name="pas"></param>
/// <returns></returns>
public string GetOne(string OleDb, params OleDbParameter[] pas)
{
string res = "";
try
{
cmd.CommandText = OleDb;
cmd.Parameters.Clear();
foreach (OleDbParameter temppa in pas)
{
cmd.Parameters.Add(temppa);
}
conn.Open();
res = cmd.ExecuteScalar() == null ? ("") : (Convert.ToString(cmd.ExecuteScalar()));
conn.Close();
}
catch (Exception ex)
{
this.ShowError(ex.Message);
return null;
}
return res;
}
/// <summary>
/// 返回数据的DataReader
/// </summary>
/// <param name="OleDb"></param>
/// <returns></returns>
public OleDbDataReader GetDataReader(string OleDb)
{
OleDbDataReader dr = null;
try
{
conn.Open();
cmd.CommandText = OleDb;
dr = cmd.ExecuteReader();
conn.Close();
}
catch (Exception ex)
{
this.ShowError(ex.Message);
return null;
}
return dr;
}
/// <summary>
/// 返回数据的DataReader带参数的
/// </summary>
/// <param name="OleDb"></param>
/// <param name="pas"></param>
/// <returns></returns>
public OleDbDataReader GetDataReader(string OleDb, params OleDbParameter[] pas)
{
OleDbDataReader dr = null;
try
{
conn.Open();
cmd.Parameters.Clear();
foreach (OleDbParameter temppa in pas)
{
cmd.Parameters.Add(temppa);
}
cmd.CommandText = OleDb;
dr = cmd.ExecuteReader();
conn.Close();
}
catch (Exception ex)
{
this.ShowError(ex.Message);
return null;
}
return dr;
}
/// <summary>
/// 打开连接
/// </summary>
public void OpenConn()
{
if (conn.State != ConnectionState.Open)
{
try
{
conn.Open();
}
catch (Exception ex)
{
this.ShowError(ex.Message);
return;
}
}
}
/// <summary>
/// 关闭连接
/// </summary>
public void CloseConn()
{
if (conn.State != ConnectionState.Closed)
{
try
{
conn.Close();
cmd = null;
conn = null;
}
catch (Exception ex)
{
this.ShowError(ex.Message);
return;
}
}
}
/// <summary>
/// 弹出错误的信息
/// </summary>
/// <param name="err"></param>
public void ShowError(string err)
{
System.Windows.MessageBox.Show(Script(err, ""));
conn.Close();
}
/// <summary>
/// 显示信息
/// </summary>
/// <param name="err"></param>
public void ShowMessage(string mes, string loc)
{
System.Windows.MessageBox.Show(Script(mes, loc));
}
/// <summary>
/// javascript脚本
/// </summary>
/// <param name="mess"></param>
/// <param name="loc"></param>
/// <returns></returns>
public string Script(string mess, string loc)
{
StringBuilder sb = new StringBuilder();
sb.Append("<script language='javascript'>");
sb.Append("alter('");
sb.Append(mess);
sb.Append("');");
sb.Append(loc);
sb.Append("</script>");
return sb.ToString();
}
对于一个常年研究工控的人来说,要深入了解这些还真需花点时间,慢慢不着急,个人探究这些内容主要还是看中Winform在上位工控机上的应用。