c# 数据库操作,多数据库操作、数据库操作异常报错等问题
1、引入相关的命名空间
在C#中要操作数据库,一般情况需要引入两个命名空间,在三种连接模式中都要引入下面的命名空间:
System.Data;描述与数据源连接的当前状态。
//
// 摘要:
// 连接已关闭。
Closed = ,
//
// 摘要:
// 连接处于打开状态。
Open = ,
//
// 摘要:
// 连接对象连接到数据源。
Connecting = ,
//
// 摘要:
// 连接对象执行命令。 (此值保留供该产品的未来版本中)。
Executing = ,
//
// 摘要:
// 连接对象正在检索数据。 (此值保留供该产品的未来版本中)。
Fetching = ,
//
// 摘要:
// 与数据源的连接已断开。 只有在打开连接后,才发生这种。 处于此状态的连接可能关闭并重新打开。 (此值保留供该产品的未来版本中)。
Broken =
而另外一个命名空间,使用不同的连接模式而不同,如果使用SqlClient模式的话,则需要引入如下命名空间:
System.Data.SqlClient;
方法
//
// 摘要:
// 如果给定包含连接字符串的字符串,则初始化 System.Data.SqlClient.SqlConnection 类的新实例。
//
// 参数:
// connectionString:
// 用于打开 SQL Server 数据库的连接。
、public SqlConnection(string connectionString);
//
// 摘要:
// 最近在连接上执行网络操作时表示 System.Data.SqlClient.SqlConnection 的状态。
//
// 返回结果:
// 一个 System.Data.ConnectionState 枚举。
、public override ConnectionState State { get; }
//
// 摘要:
// 关闭与数据库之间的连接。 此方法是关闭任何打开连接的首选方法。
//
// 异常:
// T:System.Data.SqlClient.SqlException:
// 打开连接时出现的连接级别的错误。
public override void Close();
3、//
// 摘要:
// 关闭与数据库之间的连接。 此方法是关闭任何打开连接的首选方法。
//
// 异常:
// T:System.Data.SqlClient.SqlException:
// 打开连接时出现的连接级别的错误。
public override void Close();
4、 //
// 摘要:
// 释放由 System.ComponentModel.Component 使用的所有资源。
public void Dispose();
//
// 摘要:
// 创建并返回与 System.Data.SqlClient.SqlConnection 关联的 System.Data.SqlClient.SqlCommand
// 对象。
//
// 返回结果:
// 一个 System.Data.SqlClient.SqlCommand 对象。
public SqlCommand CreateCommand();
//
// 摘要:
// 获取或设置要在数据源中执行的 Transact-SQL 语句、表名或存储过程。
//
// 返回结果:
// 要执行的 Transact-SQL 语句或存储过程。 默认值为一个空字符串。
、public override string CommandText { get; set; }
C#中Dispose、析构函数、close的区别
如果使用OleDb模式的话,需要使用下面的命名空间:
System.Data.OleDb;
如果使用Odbc模式的话,需要使用下面的命名空间:
System.Data.Odbc;
2、定义连接字符串,并建立连接对象
在C#中,如果想连接数据库的话,需要使用Connection连接对象。同样,不同的连接模式下,所使用的连接对象也不同:
(1)如果使用SqlClient模式的话,其基本连接字符串和连接对象如下:
连接字符串:string connString = "server=.;database=testDB;uid=sa;pwd=;";
其中,server是指数据库所在的机器(服务器),如果使用当前机器(本地机器)的话,可 以使用“.”、“(local)”、“127.0.0.1”或本地机器的名字。如果使用其它机器上的数据库的话,可以使用那台机器的机器名字(确保域和工 作组的正确)或IP地址。database指的数据库的名字。uid和pwd分别代表连接数据库的用户名和密码。
定义连接字符串后,就可以建立SqlClient模式下的连接对象了,在SqlClient模式下,应使用SqlConnection。
SqlConnection sConn = new SqlConnection(connString);
例子,建立一个公共类DBConn.cs

若想调用:
SqlConnection conn = BaseClass.DBConn.CyCon();
conn.Open();
(2)如果使用OleDb模式的话,其基本连接字符串和连接对象如下:
连接字符串:string connString = "Provider=SQLOLEDB.1;DataSource=(local);uid=sa;pwd=;Initial Catalog=testDB";
其中,Provider给出数据提供程序;DataSource给出数据库所在的服务器名或 IP地址(具体同SqlClient模式下的server关键字);uid和pwd分别指用户名和密码;Initial Catalog给出的是所连接的数据库的名字。如果使用Access数据库的话,其连接字符串的形式应该如下:
string connString = "provider=Microsoft.Jet.OLEDB.4.0;Data Source = F:\\student.mdb";
定义好连接字符串后,就可以定义连接对象了,在该模式下,应使用OleDbConnection。
OleDbConnection odConn = new OleDbConnection(connString);
(3)如果使用Odbc模式的话,其基本连接字符串和连接对象如下:
连接字符串:string connString = "Driver={Sql Server};Server=.;Database = testDB;uid=sa;pwd=;";
如果使用Access数据库,其连接字符串如下:
string connString = "{Microsoft Access Driver(*.mdb)};Dbq = \"F:\\student.mdb\";";
定义好连接字符串后,使用OdbcConnection建立连接对象:
OdbcConnection oConn = new OdbcConnection(connString);
3、打开数据库连接
打开数据库使用Open方法,但在试图打开数据连接时会发生错误,因此常采用如下的异常控制方法(这里假设打开SqlClient模式下连接,实际上只不过连接对象的名字不同而已):
try
{
sConn.Open();
}
catch(Exception ex)
{
MessageBox.Show("发生错误:"+ex.Message);
//Console.WriteLine("发生错误:"+ex.Message); //在控制台下使用这种方式
}

4、Command命令对象的应用
Command用于向数据库传输的命令的对象,其构造函数常用两个参数,一个参数是所使用的 命令文本(CommandText),另一个为所使用的连接对象Connection。根据不同的数据库连接模式,其形式也不同,SqlCommand对 应着SqlClient模式;OleDbCommand对应着OleDb模式,OdbcCommand对应着Odbc模式。
假设我们想使用SqlClient模式查询Sql Server中testDB数据库中student表中的xh(学号)、xm(姓名)和xb(性别)三列的值,则可以建立如下的命令对象(sConn参见建立的连接sConn:
SqlCommand sCmd = new SqlCommand("SELECT xh,xm,xb FROM student",sConn);
亦可使用如下的形式:
SqlCommand sCmd = new SqlCommand();
sCmd.CommandText = "SELECT xh,xm,xb FROM student";
sCmd.Connection = sConn;
命令对象常用的有三个方法:ExecuteReader(), ExecuteNonQuery()和ExecuteScalar()。ExecuteReader方法用于返回查询结果的全部数据。 ExecuteNonQuery方法用于返回所影响的行数,一般用于Insert、Update和Delete操作。ExecuteScalar方法返回 结果中的第一行第一列的值。
//查询
string names = lvDesk.SelectedItems[].SubItems[].Text;
SqlConnection conn = BaseClass.DBConn.CyCon();
conn.Open();
SqlCommand cmd = new SqlCommand("select * from tb_Room where RoomName='" + names + "'", conn);
SqlDataReader sdr = cmd.ExecuteReader();
sdr.Read();
string zt = sdr["RoomZT"].ToString().Trim();
sdr.Close(); //删除、修改
string names = lvDesk.SelectedItems[].SubItems[].Text;
SqlConnection conn = BaseClass.DBConn.CyCon();
conn.Open();
SqlCommand cmd = new SqlCommand("update tb_Room set RoomZT='待用',Num=0 where RoomName='" + names + "'", conn);
cmd.ExecuteNonQuery();
cmd = new SqlCommand("delete from tb_GuestFood where zhuotai='" + names + "'", conn);
cmd.ExecuteNonQuery();
conn.Close();
frmMain_Activated(sender, e);
5、数据读取器DataReader
内置方法
、
//
// 摘要:
// 让 System.Data.SqlClient.SqlDataReader 前进到下一条记录。
//
// 返回结果:
// 如果存在更多行,则为 true;否则为 false。
//
// 异常:
// T:System.Data.SqlClient.SqlException:
// 执行命令文本时,SQL Server 返回了一个错误。
public override bool Read();
// 摘要:
// 获取指定列的值作为字符串。
//
// 参数:
// i:
// 从零开始的列序号。
//
// 返回结果:
// 指定列的值。
//
// 异常:
// T:System.InvalidCastException:
// 指定的强制转换无效。
public override string GetString(int i);
DataReader用于从返回来的数据区中读取数据。其根据使用的数据连接模式不同也有不同的形式:SqlDataReader对应着SqlClient模式,OleDbDataReader对应着OleDb模式,OdbcDataReader对应着Odbc模式。
数据读取器应与命令对象配合使用,下面接着4中的例子来写:
SqlDataReader sdr = null;
sdr = sCmd.ExecuteReader(); //执行命令对象,并用sdr指向结果集的第一条记录。
while(sdr.Read()) //每读取一条记录后,指向其下一条记录
{
Console.WriteLine("学号:{0},姓名:{1},性别:{2}",sdr["xh"],sdr["xm"],sdr["xb"]); //或使用下面的格式
// Console.WriteLine("学号:{0},姓名:{1},性别:{2}",sdr[0],sdr[1],sdr[2]);
}
sdr.Close(); //关闭读取器

在类中可以定义一个全局的变量读取
public SqlDataReader sdr;
6、数据集DataSet和数据适配器DataAdapter
一般数据集和数据适配器是密不可分的,下面先介绍数据适配器。
数据适配器可以容纳一组数据命令和一个数据库连接对象,这与Command对象不同, Command只有一个数据命令和一个数据库连接。数据适配器根据不同的连接模式也有不同的形式:SqlDataAdapter、 OleDbDataAdapter和OdbcDataAdapter。下面给出SqlClient模式下数据适配器的定义方式:
SqlDataAdapter sda = new SqlDataAdapter("SELECT xh,xm,xb FROM student",sConn);
第一个参数是用到的SQL语句,第二个参数是数据连接。也可以使用一个命令对象传递上面的信息。即:
SqlDataAdapter sda = new SqlDataAdapter(sCmd);
下面再介绍一下DataSet,DataSet是在内存中缓存的数据集,包括数据本身,还包括定义在数据上的约束和关系等信息。数据集中可以包含0个这样的数据对象。不管使用什么样的数据库连接模式,其只有唯一的形式。其定义方法如下:
DataSet ds = new DataSet();
定义完数据集后,就可以调用数据适配器的Fill方法来填充数据集:
sda.Fill(ds);
也可以在填充的同时,指定表名:
sda.Fill(ds,"Student");
可以使用下面的方法读取数据集中的数据信息:
int rowNum = ds.Tables["Student"].Rows.Count; //获得数据集表student表中的行数
int columnNum = ds.Tables["Student"].Columns.Count; //获得数据集表student中的列数
for(int i = 0; i < rowNum; i ++)
{
for(int j = 0; j < columnNum; j ++)
{
Console.Write(ds.Tables["student"].Columns[j].ColumnName+":"+ds.Tables["student"].Rows[i][j].ToString();
}
Console.WriteLine();
}
using System;
//引入命名空间
using System.Data;
using System.Data.SqlClient;
class DbOper
{
static void Main()
{
//定义连接字符串
string connString;
connString="server=.;uid=sa;pwd=;database=test;";
//定义连接对象sConn
SqlConnection sConn = new SqlConnection(connString);
try
{
//打开连接
sConn.Open();
}
catch(Exception ex)
{
//给出错误信息
Console.WriteLine("连接错误:"+ex.Message);
}
//定义SQL查询语句
string sql;
sql = "select * from student";
//定义命令对象sCmd
SqlCommand sCmd = new SqlCommand(sql,sConn);
//定义数据读取器sdr
SqlDataReader sdr=null;
//执行命令对象sCmd并赋值给sdr
sdr = sCmd.ExecuteReader();
//循环输出sdr中的内容
Console.WriteLine(" 学 号 姓名 性别民族");
while(sdr.Read())
{
Console.WriteLine(sdr[]+" "+sdr["xm"]+sdr["xb"]+" "+sdr["mz"]);//可以以字段第几个,字段名称来找取值
}
//关闭数据读取器
sdr.Close();
//关闭数据库连接
sConn.Close();
}
<code class="language-csharp"><span style="font-family:'Times New Roman';">//********************使用SqlDataAdapter
//数据库连接字符串 string strConnection = "Data Source=DREAM-PC;database=StudentData;uid=**;pwd=**";
public DataTable GetStudent()
{
SqlConnection conn = new SqlConnection(strConnection);
SqlCommand comm;
DataSet dtSet=new DataSet();
try
{
conn.Open();
string sqlstr="select * from StudentInfo";
comm = new SqlCommand(sqlstr,conn);
SqlAtapter sqlAdapter = new SqlDataAdapter(comm);
sqlAdapter.Fill(dtSet);
return dtSet.Tables[];
}
finally
{
if(conn.State == ConnectionState.Open)
conn.Close();
}
}</span></code>
DataSet.Tables[0].Rows[0][1]的含义
DataSet.Tables[0].Rows[0][1]表示DataSet中第一张表(因为Tables[0]就是第一张表的意思)中第一行(Rows[0][])
第二列(Rows[][1])的数据。
DataSet.Tables["tableName"]是指定获取特定的表名。如果DataSet只有一张表,则为DataSet.Tables[0].
定义一些公共方法
#region 建立数据库连接
/// <summary>
/// 建立数据库连接.
/// </summary>
/// <returns>返回SqlConnection对象</returns>
public static SqlConnection getcon()
{
My_con = new SqlConnection(M_str_sqlcon); //用SqlConnection对象与指定的数据库相连接
My_con.Open(); //打开数据库连接
return My_con; //返回SqlConnection对象的信息
}
#region 测试数据库是否赋加
/// <summary>
/// 测试数据库是否赋加
/// </summary>
public void con_open()
{
getcon();
//con_close();
}
#endregion
#region 创建DataSet对象
/// <summary>
/// 创建一个DataSet对象
/// </summary>
/// <param name="M_str_sqlstr">SQL语句</param>
/// <param name="M_str_table">表名</param>
/// <returns>返回DataSet对象</returns>
public DataSet getDataSet(string SQLstr, string tableName)
{
getcon(); //打开与数据库的连接
SqlDataAdapter SQLda = new SqlDataAdapter(SQLstr, My_con); //创建一个SqlDataAdapter对象,并获取指定数据表的信息
DataSet My_DataSet = new DataSet(); //创建DataSet对象
SQLda.Fill(My_DataSet, tableName); //通过SqlDataAdapter对象的Fill()方法,将数据表信息添加到DataSet对象中
con_close(); //关闭数据库的连接
return My_DataSet; //返回DataSet对象的信息 //WritePrivateProfileString(string section, string key, string val, string filePath);
}
#endregion
#region 读取指定表中的信息
/// <summary>
/// 读取指定表中的信息.
/// </summary>
/// <param name="SQLstr">SQL语句</param>
/// <returns>返回bool型</returns>
public SqlDataReader getcom(string SQLstr)
{
getcon(); //打开与数据库的连接
SqlCommand My_com = My_con.CreateCommand(); //创建一个SqlCommand对象,用于执行SQL语句
My_com.CommandText = SQLstr; //获取指定的SQL语句
SqlDataReader My_read = My_com.ExecuteReader(); //执行SQL语名句,生成一个SqlDataReader对象
return My_read;
}
#endregion
#region 创建DataSet对象
///<summary>
///创建一个DataSet对象
///</summary>
///<param name="M_str_sqlstr">SQL语句</param>
///<param name="M_str_table">表名</param>
///<returns>返回DataSet对象</returns>
#endregion
public DataSet getDataSet(string SQLstr, string tableName)
{
getcon();//打开与数据库的连接
SqlDataAdapter SQLda = new SqlDataAdapter(SQLstr, My_con);//创建一个SqlDataAdapter对象,并获取指定数据表的信息
DataSet My_DataSet = new DataSet();//创建DataSet对象
SQLda.Fill(My_DataSet, tableName);//通过SqlDataAdapter对象的Fill()方法,将数据表信息添加到DataSet对象中
con_close(); //关闭数据库的连接
return My_DataSet;//返回DataSet对象的信息
}
二、异常
1、CommandText 属性尚未初始化
c# 数据库操作,多数据库操作、数据库操作异常报错等问题的更多相关文章
- 数据库安装后无法访问且mysql重启报错的解决方法
数据库安装后无法访问,mysql重启报错: 或报错:MySQL is running but PID file could not be found 解决方法: 第一种方法:看磁盘是否已满:df –h ...
- C# 保存PictureBox中的图片到数据库,并从数据库读取图片显示到PictrueBox,解决报错 “无效参数”
下面是两段关键代码: /// <summary> /// 将一张图片转换为字节 /// </summary> /// <param name="img" ...
- django连接mysql数据库配置,出现no module named mysqldb报错
作为一个菜鸟运维也是要有梦想的,万一学会了python走向人生巅峰了呢.好吧,都是瞎想,今天主要介绍下django配置,最近也开始摸索这个牛b框架了,当然大佬肯定不屑一顾,都是照顾照顾我们这些菜鸟初学 ...
- db2 数据库操作JDBC .addBatch() 方法执行时,报错排查结果
今天调试db2数据的存储时,jdbc使用addBatch方法时,抛出异常,异常信息如下: [jcc][1091][10404][3.62.56] 数据转换无效:参数实例 对于所请求的转换无效. ER ...
- mybatis批量update操作的写法,及批量update报错的问题解决方法
mybatis的批量update操作写法很简单,如下: public interface YourMapper extends BaseMapper<YourExt> { void upd ...
- adb的常见命令和异常报错操作
adb连接状态 adb devices , 获取设备列表及设备状态 设备的状态有 3 种 device , 设备连接正常 offline , 设备离线,连接出现异常 unauthorized 设备为进 ...
- 深夜一次数据库执行SQL思考(怎么看执行报错信息)
如下sql在执行时 DROP TABLE IF EXISTS `book`; CREATE TABLE `book` ( `id` int(11) NOT NULL AUTO_INCREMENT, ` ...
- java操作数组转list集合删除元素报错ConcurrentModificationException
public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>( ...
- Mysql 数据库date, datetime类型设置0000-00-00默认值(default)报错问题
Mysql 数据库date, datetime类型设置0000-00-00默认值报错问题 现象:MySQL5.7版本之后,date, datetime类型设置默认值"0000-00-00&q ...
随机推荐
- MyISAM与InnoDB 的区别
1. 事务:InnoDB支持,MyISAM不支持,在InnoDB中每一条SQL语句都会默认封装成事务自动提交,然而这样会影响速度,因此最好把多条SQL语句放在begin和commit之间组成一个事务: ...
- Springboot注解使用总结
使用Spring boot已经有段时间了,但是对很多注解的使用经常会遇到模糊甚至不解的地方,这次有时间便总结一下. 注解(Annotation)概念 注解是Java5开始对元数据的支持,注解与注释是有 ...
- 洛谷题解P1047 校门外的树
题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,…,L,都种有 ...
- window安装dlib、face_recognition
face_recognition简介 face_recognition是Python的一个开源人脸识别库,支持Python 3.3+和Python 2.7.引用官网介绍: Recognize and ...
- STM32之GD25Q256应用笔记
前言 使用标准SPI指令格式: 3字节地址模式或4字节地址模式: 支持SPI 总线 模式0 和 模式3: 存储容量32MB: 时钟频率范围:80Mhz – 104Mhz: 主机:STM32F103ZE ...
- Day 26:Dom4j修改xml
Dom4j:Writing a document to a file import java.io.File; import java.io.FileOutputStream; import org. ...
- Linux系统发现新恶意软件
导读 安全研究人员发现了一种新的Linux恶意软件,它似乎是由中国黑客创建的,并被用作远程控制受感染系统的手段. 这个恶意软件命名为HiddenWasp,由用户模式rootkit,木马和初始部署脚本组 ...
- NetWork--记一次Http和TLS抓包
参考 前言 工具 wireshark IP 发送方IP: 150.236.224.39 服务IP: 10.210.164.20 消息 Http,Https消息使用org.apache.http.cli ...
- Exchange 2003 群集迁移 & SPS 2003 迁移、SQL Server 2000群集
哈哈,本人自己写的文档,内容太多了,有195页,上传到Blog里面,应该是很难看的,排版也不太好. 记得下载时后改名字,用WinRAR解压合并. 第1章 迁移环境介绍 第2章 共享磁盘柜配置 第3章 ...
- Go语言 使用append() 为切片动态添加元素
Go语言的内建函数 append() 可以为切片动态添加元素.不过需要注意的是,在使用 append() 函数为切片动态添加元素时,如果空间不足以容纳足够多的元素,切片就会进行“扩容”,此时新切片的长 ...