Ado.net2.0特性(一):学习的开始~~
- -太累了本想发昨天那个的第二篇~~结果~~只能把早就准备好的法了~~哈哈原谅我哈
首先看个我自己画的结构图~~艺术品
- -顺便说说这也是我比较系统地学习~~建议大家卖本书~~然后坐例子~~当然我这得例子~~有些是原创的德的德困死了.....
复习下
1---
DbConnection con=new SqlConnection();
con.ConnectionString="连接字符串"
2-连接Odbc--
Driver=用于连接的ODBC驱动
Dsn-以一个数据源名称
Server=所要连接服务器的名称
Trusted_Connection=根据当前登录的用户所使用的域名帐户指定安全措施
DataBase=所要连接的数据库
DBQ=物理路径
3-Server
Data Source=数据库服务器的名称或者是Ip,本机用 .
dataBase=数据库的名称
user
pwd
Enlist ,在设置为 ture的时候-,连接池(pooler)自动将连接列入调用者线程的当前事务上下文中
Pooling=true请求从连接池中取出一个新的连接,如果不存在连接池,则创建他
Max Pool Size-最大的连接池数量默认是100
Min Pool Size-最小连接数默认是 0
async=true时支持异步
Connection Reset=默认为true-从连接池中删除连接的时候会重置连接
MultipleActiveResultSers=在设置为true的时候,准许从同一个连接上获取多个只进只读的结果集,默认是false
//---得到网站的根目录的物理路径
Response.Write(AppDomain.CurrentDomain.BaseDirectory as string);
//-----------得到网站根目录+数据库文件夹的物理路径
Response.Write(AppDomain.CurrentDomain.GetData("DataDirectory") as string);
我们把SqlServer某个Db解剖了~~看看他老的构造
//-----------------------------------读取整个数据库和指定数据库的信息
页面<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ic.aspx.cs" Inherits="ic" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" OnSelectedIndexChanged="GridView1_SelectedIndexChanged"
OnSelectedIndexChanging="GridView1_SelectedIndexChanging">
<Columns>
<asp:CommandField ShowSelectButton="True" />
</Columns>
</asp:GridView>
</div>
<asp:GridView ID="GridView2" runat="server">
</asp:GridView>
</form>
</body>
</html>
//--------------------代码
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class ic : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
this.DataGriveBin(this.GridView1, "");
}
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
}
protected void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
{
GridView1.EditIndex= e.NewSelectedIndex;
this.DataGriveBin(this.GridView1, "");
TextBox tm = GridView1.Rows[e.NewSelectedIndex].Cells[1].Controls[0] as TextBox;
this.DataGriveBin(this.GridView2, tm.Text);
}
//为传入的GridView邦定构架信息,-------根据传近来的命令选择,如果是空则邦定全局构架,不是空邦定具体的一个
public void DataGriveBin(GridView temp, string Command)
{
System.Data.SqlClient.SqlConnection my = new System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["TestConnectionString"].ToString());
DataTable sa = null;
try
{
my.Open();
if (Command == "")
{
//--空读取全部
sa = my.GetSchema();
}
else
{
//--不是空则读取指定的构造
sa = my.GetSchema(Command);
}
temp.DataSource = sa;
temp.DataBind();
}
catch (System.Data.SqlClient.SqlException ex)
{
}
finally
{
my.Close();
}
}
}
你联想到什么了么??对了就拿些自动生成实体类的咚咚惯用的
Ok完大了还是看看基础把---DataColumn 总结
DataColumn vin=new DataColumn("vin");
vin.DataType =typeof(string);
vin.MaxLength=23,-1这意味这不会对最大长度检查
vin.Unique=true;--是否准许重复的
vin.AllowDBNull=默认为 True,可以没有数据
vin.Caption=标题
DataTable.PrimaryKey=new DataColumn[]{vin};//---设置标题
DataTable.Load(dataRow,LoadOption枚举);//利用datarow中的主建更新DataTable中有相同的主建的列,并把更新后的DataRow和更新前的DataRow设置成LoadOption枚举需要的样子
LoadOption枚举
OverwriteChanges将原来的行和新行共同设置为Unchanged
PreserveChanges不该原来行的设置,将新行设置为;Unchanged
Upsert:不该原来行的设置,新航的设置为Added,如果新行和旧行的设置一样的时候则它们的设置为
,Unchanged,如果它们不同,则设置为Modified
~~太麻烦了看个例子吧
newAuto["vin"]="1234";
newAuto["Make"]="Ford";
DataTalbe.Rows.add(newAuto);
DataTaLbe.LoadDataRow(new oject[]{"1234","ttttt"},LoadOption.OverWriteChanges);//----------更新1234
//--------------------------------DataRow
Detached-DataRow创建了但是没有加到某个DataTable中
Added-创建了dataroe并添加到DataTable中
Unchanged--自从上一次调用AcceptChanges方法后还有没有修改DataRow对象,在调用AcceptChanges方法时 ,DataRow对象 时DataRow将改为这个状态
Modified--自上一次调用AcceptChanges方法后已经修改了DataRow对象
Deleted-使用DataRow类的Delete方法删除了DataRow对象
---------DataRow生存其变化:测试数据
DataRow MyRow = myDataTable.NewRow();--->RowState=Detached, 创建还没有添加到DataTable中
myDataTable.Rows.Add(MyRow);--->RowState=Added, 创建并且添加到DataTable中
MyRow["ddd"] = "aaa";--->RowState=Added, 创建并且添加到DataTable中
myDataTable.RejectChanges();--->RowState=Detached, 回滚自该表家在以来到上次调用提交方法,之间的数据,所以该Row状态为-创建还没有添加到DataTable中
myDataTable.Rows.Add(MyRow); myDataTable.AcceptChanges();--->RowState=Unchanged,
MyRow["ddd"] = "aaa";--->RowState=Modified, 自上次调用.AcceptChanges();后修改了数据
MyRow.Delete();--->RowState=Deleted, 使用DataRow删除DataRow对象
不清楚的兄弟姐妹用下面的代码测试下就知道了~~原创对了上面那个也是~~
DataTable myDataTable = new DataTable();
myDataTable.Columns.Add(new DataColumn("ddd",typeof(String)) );
DataRow MyRow = myDataTable.NewRow();
Response.Write(string.Format("DataRow MyRow = myDataTable.NewRow();--->RowState={0}, 创建还没有添加到DataTable中 ", MyRow.RowState.ToString()));
myDataTable.Rows.Add(MyRow);
Response.Write(string.Format("<br>myDataTable.Rows.Add(MyRow);--->RowState={0}, 创建并且添加到DataTable中", MyRow.RowState.ToString()));
MyRow["ddd"] = "aaa";
Response.Write(string.Format("<br>MyRow[\"ddd\"] = \"aaa\";--->RowState={0}, 创建并且添加到DataTable中", MyRow.RowState.ToString()));
myDataTable.RejectChanges();
Response.Write(string.Format("<br>myDataTable.RejectChanges();--->RowState={0}, 回滚自该表家在以来到上次调用提交方法,之间的数据,所以该Row状态为-创建还没有添加到DataTable中", MyRow.RowState.ToString()));
myDataTable.Rows.Add(MyRow);
myDataTable.AcceptChanges();
Response.Write(string.Format("<br> myDataTable.Rows.Add(MyRow); myDataTable.AcceptChanges();--->RowState={0}, ", MyRow.RowState.ToString()));
MyRow["ddd"] = "aaa";
Response.Write(string.Format("<br>MyRow[\"ddd\"] = \"aaa\";--->RowState={0}, 自上次调用.AcceptChanges();后修改了数据", MyRow.RowState.ToString()));
MyRow.Delete();
Response.Write(string.Format("<br>MyRow[\"ddd\"] = \"aaa\";--->RowState={0}, 使用DataRow删除DataRow对象", MyRow.RowState.ToString()));
~~哈哈听说DataRow-在运行时有多个版本~~不信么???
Current--在数据发生变化后DataRow当前的数据--只有DataRowState的数值为Deleted否则该版本的数据都存在
Default-如果DataRowState的值为Added或Modified,则默认版本是current.如果DataRowState的数值为Deleted,则抛出异常 ,如果执行了
BeginEdit方法,则为Propsed
Original--其数值为原先DataRow中加载的数据,或者是上一次执行AcceptChanges方法的数值,注意只有在DataRowState的数值为Modified,Unchanged或
Deleted是该版本才会存在,如果DataRowState的数值为Deleted,则该信息可获取的,如果DataRowState为Added则抛出异常
Proposed-在编辑DataRow对象的数值.如果DataRowState的数值为Deleted,则报告异常,如果还未显示的执行BeginEdit方法,或如果通过编辑一个独立的 DataRow对象一个还没有添加到DataTable中的对象中孤立DataRow对象,来隐式地执行BeginEdit方法则报错
DataRow-对象包含一个HasVersion-方法-可以查找DataRowVersion=的数值是否存在
//--实在睁不开眼睛了~~最后的例子~~原创~~阿阿阿
protected void Page_Load(object sender, EventArgs e)
{
DataTable myDataTable = new DataTable();
myDataTable.Columns.Add(new DataColumn("ddd",typeof(String)) );
myDataTable.Columns.Add(new DataColumn("dd1", typeof(String)));
DataRow MyRow = myDataTable.NewRow();
MyRow["ddd"] = "aaa";
MyRow["dd1"] = "222";
//---------使用RejectChanges()使用心得
//myDataTable.RejectChanges();//回滚时,在上次调用AcceptChanges()或初始化之间的数据都会消失比如上面的 myDataTable.Rows.Add(MyRow);
//添加这行有与属于没有调用提交方法所以行被删除,且 MyRow["ddd"] = "aaa",给行添加的数据也不存在
//一旦行调用了提交方法AcceptChanges();行的回滚方法RejectChanges();只能回滚提交方法后修改得数据或状态
myDataTable.Rows.Add(MyRow);
MyRow.AcceptChanges();
myDataTable.AcceptChanges();
myDataTable.RejectChanges();//虽然调用回滚方法单上面已经调用了提交方法股数据不受到影响
Response.Write(string.Format("<br> myDataTable.Rows.Add(MyRow); myDataTable.AcceptChanges();--->RowState={0}, ", MyRow.RowState.ToString()));
MyRow["ddd"] = "aaa";
Response.Write(string.Format("<br>MyRow[\"ddd\"] = \"aaa\";--->RowState={0}, 自上次调用.AcceptChanges();后修改了数据", MyRow.RowState.ToString()));
MyRow.Delete();
Response.Write(string.Format("<br>MyRow[\"ddd\"] = \"aaa\";--->RowState={0}, 使用DataRow删除DataRow对象", MyRow.RowState.ToString()));
this.GridView1.DataSource = this.GetDataRowInfo(MyRow);
GridView1.DataBind();
}
/// <summary>
/// 在DataRowVersion中检测dataRow中的某行的某个状态中数据是否存在
/// </summary>
/// <param name="row">要检测的行</param>
/// <param name="columnName">要检测的列</param>
/// <returns>返回检测状态</returns>
private string GetDataRowInfo(DataRow row, string columnName)
{
System.Text.StringBuilder retVal = new System.Text.StringBuilder(string.Format("RowState:{0}*", row.RowState));
foreach(string vers in Enum.GetNames(typeof(DataRowVersion)))
{
//retVal.Append(string.Format("Version:{0};value:{1}*", vers, row[columnName].ToString()));
DataRowVersion version = (DataRowVersion)Enum.Parse(typeof(DataRowVersion), vers);
if (row.HasVersion(version))
{
retVal.Append(string.Format("Version:{0};value:{1}*", version, row[columnName,version].ToString()));
}
else
{
retVal.Append(string.Format("Version:{0};value:{1}*", version, "does not exist"));
}
}
return retVal.ToString();
}
/// <summary>
/// 在分析一个行中所有列的数据版本
/// 返回数值不一样,参数个数一样不够成重载
/// </summary>
private DataTable GetDataRowInfo(DataRow row)
{
System.Text.StringBuilder retVal = new System.Text.StringBuilder(string.Format("RowState:{0}\r\n", row.RowState));
DataTable retTable = new DataTable();
retTable.Columns.Add(new DataColumn("RowState", typeof(string)));
retTable.Columns.Add(new DataColumn("ColumnName", typeof(string)));
retTable.Columns.Add(new DataColumn(DataRowVersion.Current.ToString(), typeof(string)));
retTable.Columns.Add(new DataColumn(DataRowVersion.Default.ToString(), typeof(string)));
retTable.Columns.Add(new DataColumn(DataRowVersion.Original.ToString(), typeof(string)));
retTable.Columns.Add(new DataColumn(DataRowVersion.Proposed.ToString(), typeof(string)));
foreach (DataColumn tempColumn in row.Table.Columns)
{
//调用重载得到一个列的数据版本情况
string[] version=new string[this.GetDataRowInfo(row, tempColumn.ColumnName).Split('*').Length];
version = this.GetDataRowInfo(row, tempColumn.ColumnName).Split('*');
DataRow temp = retTable.NewRow();
temp[0] = version[0].Split(':')[1];
temp[1] = tempColumn.ColumnName;
temp[2] = version[1].ToString().Split(';')[1].Split(':')[1];
temp[3] = version[2].Split(';')[1].Split(':')[1];
temp[4] = version[3].Split(';')[1].Split(':')[1];
temp[5] = version[4].Split(';')[1].Split(':')[1];
retTable.Rows.Add(temp);
}
return retTable;
}