asp.net数据库查询

数据库查询

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,它跟踪此行是如何变化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值