access insert语句怎么写_C# Windows Forms 笔记 - 操作 Access 资料库

▌需要 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);
    }
}

根据 sqlStrconnStr 把资料载入到 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-System​github.com
v2-097a0084dd1ca4cb41ba550f0b8a5c6a_ipico.jpg

里面操作 Access 资料库的部分。(这份是我的作业) (PointCardSystem 点卡系统)

不过我大部分是用静态成员变量和静态成员函数。

上面的函数其实繁复了一点点,因爲我使用了静态成员变量和静态成员函数的缘故。

dataTable, sqlStr, connStr 等等不需要作为参数输入,在外面一早声明好的了。

___

还有很多可以改进的地方,不过这份作业已经做完,就算了。

___

谢谢阅读本文章!~

___

C# Windows Forms 笔记 - 目录

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值