▌需要 using System.Data.OleDb;
最一开始连接数据库的部分,看别人的文章,不重复造这个轮子了:
C# 一步步連線操作ACCESS資料庫www.itread01.com▌查询:
对于有回传的指令(e.g. select),可以使用 OleDbDataAdapter
。
需要 DataTable
用作接收,两个字串作为参数,分别是 SELECT语句 和 连接语句。
DataTable dataTable = new DataTable();
string selectSqlStr = "SELECT * FORM <table>";
string connStr = "Provider=Microsoft.ACE.OLEDB.12.0; " +
"Data Source = <path>";
尖括弧是你需要修改的地方。
▌使用 OleDbDataAdapter
:
OleDbDataAdapter oleDbDataAdapter = new OleDbDataAdapter(selectSqlStr, connStr);
dataTable.Clear();
oleDbDataAdapter.Fill(dataTable);
oleDbDataAdapter.Dispose();
Clear()
清空 DataTable
。
Fill()
把从资料库查询到的资料载入 DataTable
。
Dispose()
释放 OleDbDataAdapter
的资源。
▌读取资料:
查询之后就需要在 DataTable
读取资料,读取方式是这样:
dataTable.Rows[<int>][<string>].ToString();
第一个方括弧是第几项纪录,类型是整数。
第二个方括弧是栏位名称,字串。
前面这一整块 dataTable.Rows[<int>][<string>]
的
类型是 object
,所以需要转换为 string
,使用 ToString()
。
▌插入/删除/修改/更新:
对于沒有回传的指令(e.g. insert, delete, updata),
可以使用 OleDbConnection
+ OleDbCommand
。
public void ExecuteSql(string sql)
{
OleDbConnection oleDbConnection = new OleDbConnection(connStr);
OleDbCommand oleDbCommand = new OleDbCommand(sql, oleDbConnection);
oleDbConnection.Open();
oleDbCommand.ExecuteNonQuery();
oleDbConnection.Close();
}
connStr
是 连接语句,建立 OleDbConnection
。
配合 sql 语句,建立 OleDbCommand
。
Open()
打开与资料库的连接。
ExecuteNonQuery()
执行 sql 语句 。
ExecuteNonQuery()
会回传被修改纪录的数目,可以用作错误检测。
Close()
关闭与资料库的连接。
▌应用:
先不要管 sql 注入的问题,我们来尝试封装几个方法。
▌首先,载入资料:
public void Load(DataTable dataTable, string sqlStr, string connStr)
{
try
{
OleDbDataAdapter oleDbDataAdapter = new OleDbDataAdapter(sqlStr, connStr);
dataTable.Clear();
oleDbDataAdapter.Fill(dataTable);
oleDbDataAdapter.Dispose();
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}
根据 sqlStr
和 connStr
把资料载入到 dataTable
。
▌直接在资料库中获取资料:
public string GetData(DataTable dataTable, string table, string column, string value, string targetColumn)
{
try
{
string selectSql = "SELECT " + targetColumn + " FROM " + table +
" WHERE " + column + " = '" + value + "' ;";
Load(dataTable, selectSql);
return dataTable.Rows[0][targetColumn].ToString();
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
return null;
}
}
回传符合栏位名 column
和数值 value
時,targetColumn
栏位上那一个资料(字串)。
建议先使用下面的 MatchingOneColumn_OfTable()
来确认该栏位有没有资料。
不然该栏位有没有资料的話,dataTable.Rows[0]
会抛出错误。
▌匹配:
匹配一个栏位。
public bool MatchingOneColumn_OfTable(DataTable dataTable, string tableName, string column, string value)
{
// Check Exist in Table //
DataBaseControl.Load(dataTable, "SELECT * FROM " + tableName +
" WHERE StrComp(" + column + ", '" + value + "', 0) = 0 ; ");
if (dataTable.Rows.Count != 0) return true;
return false;
}
同時匹配两个栏位。
public static bool MatchingTwoColumn_OfTable(DataTable dataTable, string tableName,
string columnOne, string columnOneValue, string columnTwo, string columnTwoValue)
{
// Check Exist in Table //
DataBaseControl.Load(dataTable, "SELECT * FROM " + tableName +
" WHERE StrComp(" + columnOne + ", '" + columnOneValue + "', 0) = 0 AND" +
" StrComp(" + columnTwo + ", '" + columnTwoValue + "', 0) = 0;");
if (dataTable.Rows.Count != 0) return true;
return false;
}
查询语句中,使用 StrComp()
是为了区分出大小写,= 0
代表相同。
这是在匹配某一栏位 column
是否拥有/存在某一数值 value
。
常用于 GetData
之前,或判断帐户密码是否对应。
▌更新:
public void Updata(string table, string column, string value, string updataColumn, string updataValue)
{
string updateSql = "UPDATE " + table + " SET " + updataColumn + " = '" + updataValue + "'" +
" WHERE " + column + " = '" + value + "' ;" ;
ExecuteSql(updateSql);
}
不用多解释,ExecuteSql()
在上面有提到。
插入(Insert)资料的部分也类似,只是修改那句 sql 就可以。
___
利用上面的函数,可以再针对每一个资料表作特例化。
例如先把上面所有的函数封装在一个类 DataBaseControl
,
建立一个新的类,关系到某一个资料表(这里是Player表)中,然后:
public string GetData_ByColumn(DataTable dataTable, string column, string value, string targetColumn)
{
return DataBaseControl.GetData(dataTable, "Player", column, value, targetColumn);
}
public string GetData(DataTable dataTable, string targetColumn)
{
return GetData_ByColumn(dataTable, "PlayerID", playerID, targetColumn); //playerID 已经外面声明
}
参数量减少,針對了 Player 表,并且用 PlayerID 作为检索的条件。
这一些代码大部分都是节录于:
CWKSC/HKIVE-GSD-SDP-Point-Card-Systemgithub.com里面操作 Access 资料库的部分。(这份是我的作业) (PointCardSystem 点卡系统)
不过我大部分是用静态成员变量和静态成员函数。
上面的函数其实繁复了一点点,因爲我使用了静态成员变量和静态成员函数的缘故。
dataTable
, sqlStr
, connStr
等等不需要作为参数输入,在外面一早声明好的了。
___
还有很多可以改进的地方,不过这份作业已经做完,就算了。
___
谢谢阅读本文章!~
___
C# Windows Forms 笔记 - 目录