• C#高级编程(32章)ADO.net


    32.2高效地使用连接

    sqlConnection类是针对sql的,而OleDbConnection 是针对其他比如access的,另外还有odbcConnection是针对odbc的,sql的访问优势就在于它可以调用高性能的sql控制访问语句!

    32.2.3 事务

    如使用Transactions类须引用下面文件(在不支持务事的数据库时,可以用以下操作)

    C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5.1System.Transactions.dll
    string source = "server=(local);integrated security=SSPI;database=Northwind";//如果是SqlExpress则使用./sqlexpress,Northwind表示数据库名称
     try
     {
         using (var scope = new TransactionScope(TransactionScopeOption.Required))//如果有环境事务,使用环境,不然新建事务,默认值,其它查看文档
         {
             using (SqlConnection conn = new SqlConnection(source))//托管释放所有资源
             {
               conn.Open();
               conn.Close();//在后面有程序时,应尽早释放
                 scope.Complete();//如果没完成,因没有调用Complete方法!事务会回滚!
             }
         }
     }
     catch (SqlException e) //抛出SQL异常,是SqlException类
     {
         throw;//异常操作
     }

    32.3命令

    以下代码中Connopen后的connection类:操作方法有以下三种

    string select = "SELECT ContactName FROM Customers";
    SqlCommand cmd = new SqlCommand(select, conn); //执行select变量中的SQL命令
    SqlCommand cmd = new SqlCommand("testpray", conn); //存储过程名称
    cmd.CommandType = System.Data.CommandType.StoredProcedure;//指定解释命令字符串为存储过程
    cmd.Parameters.AddWithValue("@prayname", "it");//参数@prayname为SQL存储过程的参数名,it为值
    using (OleDbConnection conn = new OleDbConnection(source))//注意这里是OleDb
    {
      conn.Open();
      OleDbCommand cmd = new OleDbCommand("Categories", conn);
      cmd.CommandType = System.Data.CommandType.TableDirect;//TableDirec命令只对OleDb有效
    }

    方法2中调用的SQL存储过程

    create proc testpray
    @prayname char(8)
    as 
    declare @_id int
    select @_id =COUNT(id)+1 from test
    insert into test(id,name)values(@_id,@prayname)
    return 1
    --下面是测试显示
    declare @str int
     exec @str = testpray artre
    select @str

    32.3.1执行命令

    方法 说明
    ExecuteNonQuery() 执行,不返回结果,返回影响的行数(int)
    ExecuteReader() 执行,返回一个类型化的IDataReader (SqlDataReader)
    ExecuteScalar() 执行,返回结果第一行的第一列的值 (object)
    ExecuteXmlReader() 执行,返回一个XmlReader对象,可以遍历从数据库返回的XML片段(XmlReader)

    ExecuteXmlReader方法中适用于SQLClient

    string select = "SELECT ContactName FROM Customers FOR XML AUTO";
    //语句后面加入FOR XML AUTO 把FROM子句中的表构建一棵树,FOR XML RAW把结果集中的行映射到元素,其中的列映射到属性,FOR XML EXPLICIT指定要返回的XML树形状
    SqlConnection conn =new SqlConnection(GetDatabaseConnection());
    SqlCommand cmd = new SqlCommand(select, conn);
    XmlReader xr = cmd.ExecuteXmlReader();//XML的操作方法
    xr.Read();
    string data;
    do
    {
        data = xr.ReadOuterXml();
        if (!string.IsNullOrEmpty(data))
            Console.WriteLine(data);
    } while (!string.IsNullOrEmpty(data));
    conn.Close()

    . 1调用存储过程(重复调用同一存储过程时)可以用以下方式

    SqlCommand cmd = new SqlCommand("testpray", conn); //存储过程名称
    cmd.CommandType = System.Data.CommandType.StoredProcedure;//指定解释命令字符串为存储过程
    cmd.Parameters.Add(new SqlParameter("@prayname",System.Data.SqlDbType.Char,0, "prayname"));//用参数名称、 SqlDbType、大小和源列名称初始化 SqlParameter 类的新实例。
    cmd.UpdatedRowSource = System.Data.UpdateRowSource.None;//不返回参数(可以改为输出的转到一个表中)
    cmd.Parameters["@prayname"].Value = "it2"; //修改
    cmd.ExecuteNonQuery();                     //执行
    cmd.Parameters["@prayname"].Value = "open";
    cmd.ExecuteNonQuery();

    1,调过带参数输出的存储过程

    cmd.Parameters.Add(new SqlParameter("@prayname", System.Data.SqlDbType.Char, 0, "prayname"));//用参数名称、 SqlDbType、大小和源列名称初始化 SqlParameter 类的新实例。
    cmd.Parameters.Add(new SqlParameter("@outid", System.Data.SqlDbType.Int, 0, ParameterDirection.Output, false, 0, 0, "outid", DataRowVersion.Default, null));
    cmd.UpdatedRowSource = UpdateRowSource.OutputParameters;//输出参数到映射的行
    cmd.Parameters["@prayname"].Value = "it2";
    cmd.ExecuteNonQuery();
    int newOutId =(int) cmd.Parameters["@outid"].Value; //取值

    32.5异步数据访问(不懂呀!!放着先)

    public async static Task<int> GetEmployeeCount()
    {
        using (SqlConnection conn = new SqlConnection(GetDatabaseConnection()))
        {
            SqlCommand cmd = new SqlCommand("WAITFOR DELAY '0:0:1';select count(*) from employees", conn);
            conn.Open();
            return await cmd.ExecuteScalarAsync().ContinueWith(t => Convert.ToInt32(t.Result)); //异步数据处理,先了解相关格式
        }
    }
     

    32.6管理数据和关系:DataSet类

    string select = "select ContactName,CompanyName from Customers";
    using (SqlConnection conn = new SqlConnection(source))
    {
        SqlDataAdapter da = new SqlDataAdapter(select, conn);//注意这里不SqlDataAdapter,不须要conn.open()
        DataSet ds = new DataSet(); //实例数据库
        da.Fill(ds, "Customers1"); //适配数据库,适配的表名为Customers1                    
        foreach (DataRow row in ds.Tables["Customers1"].Rows) //遍历
            Console.WriteLine("'{0}' from {1}", row[0], row[1]);                   
    }

    2手工编织架构

    /// <summary>
    /// 在实例化DataSet后调用,以便格式化DataSet,这样就能对DataTable中的数据进行类型安全访问
    /// </summary>
    /// <param name="ds">实例</param>
    public static void ManufactureProductDataTable(DataSet ds)
    {
        DataTable products = new DataTable("products");
        products.Columns.Add(new DataColumn("productID", typeof(int)));
        products.Columns.Add(new DataColumn("name", typeof(string)));
        ds.Tables.Add(products);
    }

    32.6.3数据关系

    设置主键

    public static void manufactrireprimaryKey(DataTable dt)
    {
        DataColumn[] pk = new DataColumn[1];
        pk[1] = dt.Columns["id"];
        dt.PrimaryKey = pk;
    }

    42.1 ASP.NET MVC

    路由机制 网络介绍链接

  • 相关阅读:
    1scala基础
    3scala高级
    03spark kafka
    01spark基础
    04spark streaming
    2scala集合
    02spark sql
    学习java程序设计环境的心得
    第五章继承
    第二周学习Java心得
  • 原文地址:https://www.cnblogs.com/praybb/p/8214648.html
Copyright © 2020-2023  润新知