[代码问题梳理]c#向Access数据库插入数据

C#学习 专栏收录该内容
4 篇文章 0 订阅

近来在做一个项目,纯粹拿来练手学习的,其中涉及到了C#与Access数据库这一块,故将其记录下来,作为个人的成长记录。
这篇文章主要有这几个小内容:

  • 向Access数据库插入数据
    • 数据的几种情况
    • 数据插入语句的书写
    • 注意事项

数据的几种情况与语句的书写

我个人认为在数据插入过程中,可以粗略地认为数据分为这三种情况:

  1. 图片
  2. 变量
  3. 具体值

大部分向Access数据库存储图片都是以存流的方式,而这种方式的思路大致是这样的:将图片路径文件流的方式读取成二进制数值,然后再讲这些二进制数值以字符数组的方式保存到数据库中

  • 单条插入的情况下:

    • 图片的插入书写:
FileStream fs = new FileStream(pbimage.ImageLocation, 
FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BinaryReader bd = new BinaryReader(fs);
byte[] buffer = bd.ReadBytes((int)fs.Length);
string sql="insert into [表名] (字段1) values (@pic)";
//插入时将字符数组作为参数传入,@表示这是一个参数,pic表示参数名
com.CommandText=sql;
com.Parameters.Add("@pic",OleDbType.Binary,(int)fs.Length);
//将其添加到参数列表中,该方法的第一个参数代表要传入的参数名,第二个参数代表该参数的数据类型,第三个参数是文件流的长度,fs是自定义的文件流对象
com["@pic"].Value=buffer;
//设置该参数的值,buffer是自定义的字符数组对象
  • 变量的插入书写
    这里所谓的变量是指要插入字段对应的字段值变量,比如说,要把文本框的内容插入到Access数据库中
    string strtxt=this.textbox1.text;
string sql="insert into [表名] (字段2) values ('"+strtxt+"')";
//等价于这段代码:
string sql="insert into [表名] (字段) values('"+this.textbox1.text+"')";
  • 具体值的插入书写
//假设你要传进的某个字段值是某个具体值,其书写格式与上述相当
//假设目前要插入该字段的值为100,则书写格式如此
string sql="insert into [表名](字段3) values('100')";

如果一条插入记录里需要插入这三种数据,根据上述则可得:

string sql="insert into[表名](字段1,字段2,字段3) values("@pic",'"+this.textbox1.text+"','100');
com.CommandText=sql;
com.Parameters.Add("@pic",OleDbType.Binary,(int)fs.Length);
  • 多条数据插入的情况:
    在实际编程中,常常需要插入多条数据,比如要将DataGridView中的所有数据插入数据库中,而Access数据库又只能一次一条插入的时候,我们就需要学习如何将多条数据插入数据库中。这是我在插入变量时所用的方法:
sql1 += "VALUES('" + smid + "'";
sql1 += ",'" + user + "'";
sql1 += ",'" + phonenumber + "'";
sql1 += ",'" + DvRow.Cells[0].Value.ToString() + "'";
sql1 += ",'" + point + "'";
sql1 += ",'" + DvRow.Cells[3].Value.ToString() + "'";
sql1+= "," + "@pic";
sql1 += "," + DateTime.Now.Date.ToOADate() + ")";
comm.CommandText = sql1;
comm.Parameters.Add("@pic", OleDbType.Binary, (int)fs.Length);
comm.Parameters["@pic"].Value = buffer;
  • 注意事项:
    ※出现无法执行com.ExecuteNonQuery()方法时,最好检查一下sql语句,可能存在这些问题:
    1.如果出现关键字,需要用[]将关键字括起来。假设字段1是该表的主键,那么sql语句应该这样书写:
string sql="insert into[表名]([字段1],字段2,字段3) values("@pic",'"+this.textbox1.text+"','100')";

2.注意表的括号:如果表名为中文,则可以不用[]号,但如果是英文,则必须要用[]将表名括起来:

//表名为用户表
string sql="insert into 用户表([字段1],字段2,字段3) values("@pic",'"+textbox1.text+"','100')";

//表名为user
string sql="insert into [user]([字段1],字段2,字段3) values("@pic",'"+textbox1.text+"','100')";

※:程序调试过程中出现该问题:在进行数据库操作(插入)过程中,系统提示该错误:由于将在索引、 主关键字、或关系中创建重复的值,请求对表的改变没有成功。 改变该字段中的或包含重复数据的字段中的数据,删除索引或重新定义索引以允许重复的值并再试一次。
解决方案:重新设置表的主键。

※:出现某个文件正由另一进程使用,因此该进程无法访问该文件。
解决方法:
重新书写文件流的初始化:

FileStream fs = new FileStream(pb.ImageLocation, FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
  • 6
    点赞
  • 0
    评论
  • 12
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

oversea_zone

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值