数据库查询
dataReader查询(只读,向前的方式)
//数据库连接设置
SqlConnection thisConnection = new SqlConnection(@"Server=WIN-8SK1EA43KTP/MSSQL08R2;Integrated Security=True;" + "Database=db_office");
//打开数据库连接
thisConnection.Open();
//创建数据库连接命令
SqlCommand thisCommand = thisConnection.CreateCommand();
//编写数据库语句
thisCommand.CommandText = "select * from email";
//执行数据库操作
SqlDataReader thisReader = thisCommand.ExecuteReader();
//读取操作返回结果
while(thisReader.Read())
{
Console.WriteLine("{0}/t{1}",thisReader["sname"],thisReader["title"]);
}
//关闭数据库连接
ThisReader.Close();
thisConnection.Close();
dataset
ado的核心对象,所有复杂的操作都使用它,只包含一个datatable对象,每个datatable对象里有一些datarow和datacolumn,dateset的常见操作是dataadapter对象的fill()方法给他填充数据。
dataset有一个tables属性,是所有datatable对象的集合,tables的类型是datatablecollection:按表名访问 thisDataSet.Tables["Customers"]指定datatable对象Customers;按索引(索引是基于0的)访问:thisDataSet.Tables[0]制定dataset对象中的第一个datatable。每个datatable都有一个Rows属性,是一个有序列表,按行号排序;myDataSet.Tables["Customers"].Rows[n](索引基于0);dataRow有个重载的索引符属性,允许按列名或列号访问各个列;myDataSet.Tables["Customers"].Rows[n]["CompanyName"]
//配置数据库连接字段
SqlConnection thisConnection = new SqlConnection(@"Server=WIN-8SK1EA43KTP/MSSQL08R2;Integrated Security=True;" + "Database=db_office");
//创建与配置数据库连接语句
SqlDataAdapter thisAdapter = new SqlDataAdapter("select * from email", thisConnection);
//创建放从数据库操作返回结果的地方
DataSet thisDataSet = new DataSet();
//将从数据库操作返回的结果放大thisDataSet的email表里(可以有多个表吧 应该)
thisAdapter.Fill(thisDataSet, "email");
//将操作返回的结果逐行读取出来
foreach (DataRow theRow in thisDataSet.Tables[0].Rows)
{
Console.WriteLine(theRow[0] + "/t" + theRow[2]);
}
thisConnection.close();
并没有明确打开和关闭连接,dataadapter对象完成了这个工作,数据授权会根据需要打开;完成后关闭(这个过程中,连接一直是打开的);
数据库更新
用数据库中要使用的数据填充DataSet,修该存储在DataSet中的数据;那DataSet中修改是数据返回到数据库;
//创建数据库连接字段
SqlConnection thisConnection = new SqlConnection(@"Server=WIN-8SK1EA43KTP/MSSQL08R2;Integrated Security=True;" + "Database=db_office");
//创建放数据库操作语句的对象
SqlDataAdapter thisDataAdapter = new SqlDataAdapter("select * from email", thisConnection);
//创建执行数据库操作语句的对象
SqlCommandBuilder thisBuilder = new SqlCommandBuilder(thisDataAdapter);
//创建放返回结果的对象
DataSet thisDataSet = new DataSet();
//执行命令并将结果放到thisDataSet中的emails表中
thisDataAdapter.Fill(thisDataSet, "emails");
//读出对象中的表emails中的第一行中的fname列
Console.WriteLine("Name befort change:{0}", thisDataSet.Tables["emails"].Rows[0]["fname"]);
//重置thisDataSet中第一个表中的第一行的第二列为“gaii”(内存中的值)
thisDataSet.Tables[0].Rows[0][1] = "gaii";
//将更改后的数据放回数据库
ThisDataAdapter.Update(thisDataSet,"emails");
//再次读出重置的数据验证已写入
Console.WriteLine("Name after change:{0}", thisDataSet.Tables[0].Rows[0]["fname"]);
//关闭数据库连接
thisConnection.Close();
在数据库中添加行,添加和更新都差不多,都是多thisDataSet的操作。在对DataSet进行数据填充后
//读出原表中的行数
Console.WriteLine("#rows before change:{0}.", thisDataSet.Tables["emails"].Rows.Count);
//依据内存中的原表中的行创建一个新行
DataRow thisRow = thisDataSet.Tables[0].NewRow();
//对新行中的列进行赋值(内存中)
thisRow[0] = 16;
//将新增加的行添加到内存中的表中
thisDataSet.Tables[0].Rows.Add(thisRow);
//再次独吃内存中新表的行数
Console.WriteLine("#rows after changer {0}.", thisDataSet.Tables[0].Rows.Count);
//将更新后的表返回到数据库中
thisDataAdapter.Update(thisDataSet, "emails");
上面的例子呢,会直提前DataSet中添加东西,不会提前做检查,这样容易出错,我们重新修改下
在数据填充后
//在使用find()之前需要构建一个用于搜索的主键
//创建一个新列(一个DataColumn数组)
DataColumn[] keys = new DataColumn[1];
//将以DataSet中的第一个表中的第一列赋值给keys[0]
keys[0] = thisDataSet.Tables[0].Columns[0];
//将keys赋给DataTable对象中的第一个表的主键
thisDataSet.Tables[0].PrimaryKey = keys;
//另一种方法是直接从数据库中加载主键,这不会默认完成,而是必须在填充DataSet之前设置DateAdapter对象中的MissingSchemaAction属性,显式的告诉Ado.net加载主键的信息;
thisDataAdapter.MissingSchemaAction=MissingSchema.AddWithKey;
thisDataAdapter.Fill(thisDataSet,"emails");
DataRow findRow=thisDataSet.Tables[0].Rows.Find(17);
//查找thisDataSet里面的第一个表里的的主键是否有18,并将结果放到findRow里
DataRow findRow = thisDataSet.Tables[0].Rows.Find(18);
//如果没有,就将新数据写进去,然后提示写入成功
if (findRow == null)
{
Console.WriteLine("17 not found ,will add to the tables.");
DataRow thisRow = thisDataSet.Tables[0].NewRow();
thisRow[0] = 18;
thisDataSet.Tables[0].Rows.Add(thisRow);
if((findRow=thisDataSet.Tables[0].Rows.Find(18))!=null)
{
Console.WriteLine("18 already added to the tables.");
}
}
//如果有就提示已经写过了
else
{
Console.WriteLine("18 ");
}
thisDataAdapter.Update(thisDataSet,"emails");
Console.WriteLine("#rows after change:{0}.",thisDataSet.Tables[0].Rows.Count);
//关闭数据库连接
thisConnection.Close();
删除行DataRow对象的Delete()方法可以删除当前行
//删除行是 在if中如下
Console.WriteLine("the row already in the table.");
Console.WriteLine("Removing .......");
//删除内存中的DataSet中的指定行
findRow.Delete();
//将伤处后的表更新到数据库
thisDataAdapter.Update(thisDataSet, "emails");
实际上Delete()方法并不执行删除操作,它仅标记要删除的行。Rows中还有一个方法RowState,它跟踪此行是如何变化