您的位置:新葡亰496net > 网络数据库 > 新葡亰496net允许远程连接到此服务器,存储过程

新葡亰496net允许远程连接到此服务器,存储过程

发布时间:2019-10-12 01:54编辑:网络数据库浏览(104)

    在SQL Server的属性-->连接中我们可以看到这样一个选项:'允许远程连接到此服务器'(英文是remote access),其默认值是1,表示此选项开启。

    1. 为什么使用存储过程

    不使用链接服务器的名称,而提供特殊的连接信息,并将其作为四部分对象名的一部分。

    存储过程简介

    但是这个参数并非是字面上所显示的那样,控制着远程连接的开关,事实上这个参数与是否可以连接到数据库毫无关系,在以后的版本中即将被废弃,其功能将完全被链接服务器取代。

         应用程序通过T-SQL语句到服务器的过程是不安全的。

    新葡亰496net 1 Transact-SQL 语法约定

    --------------------------------------------------------------------------------什么是存储过程:存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。

    新葡亰496net 2

         1) 数据不安全

    新葡亰496net 3  语法

    存储过程的好处:

    官网解释:

          2)每次提交SQL代码都要经过语法编译后在执行,影响应用程序的运行性能

    OPENDATASOURCE ( provider_name, init_string )
    

    1.由于数据库执行动作时,是先编译后执行的。然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高。

    “远程访问” 选项从运行 SQL Server 实例的本地或远程服务器上控制存储过程的执行。 该选项的默认值为 1。 这将授权允许从远程服务器执行本地存储过程或从本地服务器执行远程存储过程。 若要阻止本地存储过程在远程服务器上执行或远程存储过程在本地服务器上执行,请将此选项设置为 0。

          3) 网络流量大

    新葡亰496net 4  参数

    2.一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率。

    下一版本的 Microsoft SQL Server 将删除该功能。 请不要在新的开发工作中使用该功能,并尽快修改当前还在使用该功能的应用程序。 改用 sp_addlinkedserver。 

     

    provider_name
    注册为用于访问数据源的 OLE DB 访问接口的 PROGID 的名称。provider_name 的数据类型为 char,无默认值。

    3.通过存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全。

     

    1. 什么是存储过程

    小结:总之存储过程是好东西,在做项目时属于必备利器,下面介绍存储过程的基本语法。

            存储过程是SQL语句和控制语句的预编译集合,保存在数据库里,可由应用程序调用执行,而且允许用户声明变量、逻辑控制语句及其他强大的编程功能。保存在SQLServer中,通过名称和参数执行,也可一返回结果。对于存储过程我更倾向于把他理解成方法。它里面可以只有一条查询语句,也可以包含一系列使用控制流的SQL语句。

    init_string
    连接字符串,该字符串将要传递给目标提供程序的 IDataInitialize 接口。提供程序字符串语法是以关键字值对为基础的,这些关键字值对由分号隔开,例如:“keyword1=value**;*keyword2=value*”。


     

    若要了解提供程序上支持的特定关键字值对,请参阅 Microsoft Data Access SDK。该文档定义了基本语法。下表列出了 init_string 参数中最常用的关键字。

    存储过程的语法和参数讲解

    1. 存储过程的优点
    关键字 OLE DB 属性 有效值和说明

    数据源

    DBPROP_INIT_DATASOURCE

    要连接的数据源的名称。不同的提供程序用不同的方法对此进行解释。对于 SQL Server Native Client OLE DB 访问接口,这指示服务器的名称。对于 Jet OLE DB 访问接口来说,这指示 .mdb 文件或 .xls 文件的完整路径。

    位置

    DBPROP_INIT_LOCATION

    要连接的数据库的位置。

    扩展属性

    DBPROP_INIT_PROVIDERSTRING

    提供程序特定的连接字符串。

    连接超时

    DBPROP_INIT_TIMEOUT

    达到该超时值后,连接尝试将失败。

    用户 ID

    DBPROP_AUTH_USERID

    用于该连接的用户 ID。

    密码

    DBPROP_AUTH_PASSWORD

    用于该连接的密码。

    目录

    DBPROP_INIT_CATALOG

    连接到数据源时的初始或默认的目录名称。

    集成安全性

    DBPROP_AUTH_INTEGRATED

    SSPI,指定 Windows 身份验证


         1) 模块化呈现设计

    新葡亰496net 5  注释

    存储过程的一些基本语法:

         2) 执行速度快,效率高

    仅当 DisallowAdhocAccess 注册表选项针对指定的提供程序显式设置为 0,并且启用 Ad Hoc Distributed Queries 高级配置选项时,OPENDATASOURCE 才可用于访问 OLE DB 数据源中的远程数据。如果未设置这些选项,则默认行为不允许即席访问。

    复制代码 代码如下:

         3) 减少网络流量

    OPENDATASOURCE 函数可以在能够使用链接服务器名的相同 Transact-SQL 语法位置中使用。因此,可以将 OPENDATASOURCE 用作四部分名称的第一部分,该部分名称引用 SELECT、INSERT、UPDATE 或 DELETE 语句中的表或视图的名称;或者引用 EXECUTE 语句中的远程存储过程。当执行远程存储过程时,OPENDATASOURCE 应该引用 SQL Server 的另一个实例。OPENDATASOURCE 不接受参数变量。

    --------------创建存储过程-----------------

         4) 具有良好的安全性

    与 OPENROWSET 函数类似,OPENDATASOURCE 应该只引用那些不经常访问的 OLE DB 数据源。对于访问次数较频繁的任何数据源,请为它们定义链接服务器。无论 OPENDATASOURCE 还是 OPENROWSET 都不能提供链接服务器定义的全部功能,例如,安全管理以及查询目录信息的功能。每次调用 OPENDATASOURCE 时,都必须提供所有的连接信息(包括密码)。

    CREATE PROC [ EDURE ] procedure_name [ ; number ]
        [ { @parameter data_type }
            [ VARYING ] [ = default ] [ OUTPUT ]
        ] [ ,...n ]

    1. 存储过程的分类
    重要提示:
    Windows 身份验证比 SQL Server 身份验证要安全得多。应尽量使用 Windows 身份验证。OPENDATASOURCE 不应该用于连接字符串中的显式密码。

    [ WITH
        { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]

          1)系统存储过程

    每个提供程序的连接要求与创建链接服务器时的参数要求相似。在 sp_addlinkedserver (Transact-SQL) 主题中列出了很多常见提供程序的详细信息。

    [ FOR REPLICATION ]

          2)扩展存储过程(属于系统存储过程的一种)

    新葡亰496net 6  权限

    AS sql_statement [ ...n ]

          3)用户自定义存储过程

    任何用户都可以执行 OPENDATASOURCE。用于连接到远程服务器的权限由连接字符串确定。

    --------------调用存储过程-----------------

     

    新葡亰496net 7  示例

    EXECUTE Procedure_name '' --存储过程如果有参数,后面加参数格式为:@参数名=value,也可直接为参数值value

    1. 系统存储过程

    以下示例将创建与服务器 London 上的 SQL Server 实例 Payroll 的即席连接,并查询 AdventureWorks.HumanResources.Employee 表。(使用 SQLNCLI 并且 SQL Server 将重定向到 SQL Server Native Client OLE DB 访问接口的最新版本。)

    --------------删除存储过程-----------------

          它一般以"sp_"开头,是由SQL Server创建、管理和使用,它存放在Resource数据库中。类似C#语言类库中的方法,暂时先不考虑它是如何编写的,先了解常用的系统存储过程及调用方法。

    SELECT *
    FROM OPENDATASOURCE('SQLNCLI',
        'Data Source=LondonPayroll;Integrated Security=SSPI')
        .AdventureWorks.HumanResources.Employee
    

    drop procedure procedure_name    --在存储过程中能调用另外一个存储过程,而不能删除另外一个存储过程

         常见的系统存储过程,见下一篇文章

    以下示例以 1997 - 2003 格式创建与 Excel 电子表格的即席连接。

    **创建存储过程的参数:

         调用方法:exec[ute]  存储过程名  [参数值]

    SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',
    'Data Source=C:DataFolderDocumentsTestExcel.xls;Extended Properties=EXCEL 5.0')...[Sheet1$] ;
    

    **1.procedure_name :存储过程的名称,在前面加#为局部临时存储过程,加##为全局临时存储过程。

     

    新葡亰496net 8  请参阅

    2.; number:是可选的整数,用来对同名的过程分组,以便用一条 DROP PROCEDURE 语句即可将同组的过程一起除去。例如,名为 orders 的应用程序使用的过程可以命名为 orderproc;1、orderproc;2 等。DROP PROCEDURE orderproc 语句将除去整个组。如果名称中包含定界标识符,则数字不应包含在标识符中,只应在 procedure_name 前后使用适当的定界符。

    1.  常用的扩展存储过程   xp_cmdshell

    参考

    OPENROWSET (Transact-SQL)
    sp_addlinkedserver (Transact-SQL)

    3.@parameter: 存储过程的参数。可以有一个或多个。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有 2.100 个参数。
    使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。有关更多信息,请参见 EXECUTE。

         xp_cmdshell  它可以完成DOS命令下的一些操作。

    其他资源

    分布式查询
    使用临时名称标识数据源

    4.data_type:参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。有关 SQL Server 提供的数据类型及其语法的更多信息,请参见数据类型。
    说明 对于可以是 cursor 数据类型的输出参数,没有最大数目的限制。

         exec  xp_cmdshell  DOS命令  [no_output]

    5.VARYING: 指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。

         说明  no_output是可选参数,表示设置执行DOS命令后是否输出返回信息。

    6.default: 参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。

         示例: exec xp_cmdshell  'mkdir  D:newdir'  output

    7.OUTPUT :表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可将信息返回给调用过程。Text、ntext 和 image 参数可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以是游标占位符。

         强调: 因为用户可以通过xp_cmdshell对操作系统做一些操作,如果该存储过程被黑客使用对操作系统做操作就麻烦了,所以通常会把xp_cmdshell 关闭掉:

    8.RECOMPILE: 表明 SQL Server 不会缓存该过程的计划,该过程将在运行时重新编译。在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,请使用 RECOMPILE 选项。

         方法一: 

    9.ENCRYPTION: 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 语句文本的条目。使用 ENCRYPTION 可防止将过程作为 SQL Server 复制的一部分发布。 说明 在升级过程中,SQL Server 利用存储在 syscomments 中的加密注释来重新创建加密过程。

         SQL Server 2008版本及以上, 通过数据库右击  选择“方面”   ,在下拉列表中选择 “服务器安全‘ , 下面的列表项中可以看到xmcmdshellEnable 设置。

    10.FOR REPLICATION :指定不能在订阅服务器上执行为复制创建的存储过程。.使用 FOR REPLICATION 选项创建的存储过程可用作存储过程筛选,且只能在复制过程中执行。本选项不能和 WITH RECOMPILE 选项一起使用。

         SQL Server2005版本及以下,通过开始- SQLServer- 外围设备查找

    11.AS :指定过程要执行的操作。

         方法二:

    12.sql_statement :过程中要包含的任意数目和类型的 Transact-SQL 语句。但有一些限制。

        关闭xp_cmdshell

    小结:看过这些基本语法后,下面我就根据语法创建各式的存储过程。

        EXEC sp_configure 'show advanced options', 1;


        RECONFIGURE;

     创建存储过程 

        EXEC sp_configure 'xp_cmdshell', 1;

    UserAccount

        RECONFIGURE;

    UserID

        开启xp_cmdshell

    UserName

        EXEC sp_configure 'show advanced options', 1;

    PassWord

        RECONFIGURE;

    RegisterTime

        EXEC sp_configure 'xp_cmdshell', 0;

    RegisterIP

         RECONFIGURE;

    12

     

    6                   

    1. 用户自定义存储过程

    6                   

       语法:

    2012-12-31

       create  proc[edure] 存储过程名

    6

                @参数1  数据类型 = 默认值 output, 

    18

                ……

    5                   

                @参数n  数据类型 = 默认值 output

    5                   

      as  

    2013-01-01

                  <SQL 语句>

    5

      go

    19

     

    1                   

     一个完成的存储过程包含以下3部分:

    1                   

       1) 输入参数、输出参数

    2013-01-01

       2) 在存储过程中执行的T-SQL语句

    1

       3) 存储过程的返回值

    20

    其中输入参数允许有默认值。

    2                   

        删除存储过程

    2                   

        drop proc  存储过程名

    2013-01-01

        if  exists (select * from sysobject where name = 存储过程名)

    2

                 drop proc  存储过程名

    21

        go

    3                   

     

    3                   

    1.  注意事项

    2013-01-01

           存储过程的声明: 输入参数可以有默认值,输出参数也可以有默认值

    3

          create proc  usp_name

    22

                      @age int = 5,

    4                   

           @name varchar(10)        

    4                   

           as 

    2013-01-01

               ……

    4

           go

    23

            执行语句:  

    5                   

               exec  pr_name  18 , 'zm'

    5                   

                exec  default  , 'zm'

    2013-01-01

                exec  @name = 'zm'

    5

           说明: 为了调用方便,最好将有默认值的存储过程参数列表放到最后。

    25

     

    7                   

           带输出参数的存储过程

    7                   

           create proc usp_name

    2013-01-01

                   @num1  int,

    7

                   @sum int output

    26

           as

    8                   

                 <SQL语句>

    8                   

           go 

    2013-01-01

         调用存储过程 

    8

          declare @sum int 

    NULL

          exec  usp_name  5, @sum  output

    NULL

          注意, 调用带有输出参数的存储过程参数后面必须带output关键字

    NULL

     

    NULL

    1. 处理存储过程中的错误

    NULL

        raiserror  ( {msg_id  | msg_str} {, serverity, state } [with option [,……]])

    针对上面的表,我使用存储过程对它做一些操作:

        其中:

    1. 只返回单一记录集的存储过程

        msg_id: 在sysmessage系统表中指定用户定义错误信息

    新葡亰496net,复制代码 代码如下:

        msg_str: 用户定义的特定信息,最长为255个字符

    -------------创建名为GetUserAccount的存储过程----------------
    create Procedure GetUserAccount
    as
    select * from UserAccount
    go

        serverity: 与特定信息相关联,表示用户定义的严重性级别。用户可选用的级别是0~18。数字越大,表示越严重。

    -------------执行上面的存储过程----------------
    exec GetUserAccount

         state : 表示错误的状态, 1~255中的值

     结果:相当于运行 select * from UserAccount 这行代码,结果为整个表的数据。

         option: 错误的自定义选项,可以使一下任意一值

    2.没有输入输出的存储过程

        LOG: 在Microsoft SQl Server 数据库引擎示例的错误日志和应用程序日志中记录错误

    复制代码 代码如下:

              NOWAIT:将消息立即发送给客户端

    -------------创建名为GetUserAccount的存储过程----------------

           SETERROR:将@@error值和 ERROR_NUMBER 值设置为msg_id 或5000, 不用考虑严重级别。

    create Procedure inUserAccount
    as
    insert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(9,9,'2013-01-02',9)
    go

              例如: raiserror ('错误信息', 16,1)

    -------------执行上面的存储过程----------------

    exec inUserAccount

     结果:相当于运行 insert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(9,9,'2013-01-02',9) 这行代码。

    3.有返回值的存储过程

    复制代码 代码如下:

    -------------创建名为GetUserAccount的存储过程----------------

    create Procedure inUserAccountRe
    as
    insert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(10,10,'2013-01-02',10)
    return @@rowcount
    go

    -------------执行上面的存储过程----------------

    exec inUserAccountRe

     解释:这里的@@rowcount为执行存储过程影响的行数,执行的结果是不仅插入了一条数据,还返回了一个值即 return value =1  ,这个可以在程序中获取,稍后在c#调用存储过程中会有说到。

    4.有输入参数和输出参数的存储过程

    复制代码 代码如下:

    -------------创建名为GetUserAccount的存储过程----------------

    create Procedure GetUserAccountRe
    @UserName nchar(20),
    @UserID int output
    as
    if(@UserName>5)
    select @UserID=COUNT(*) from UserAccount where UserID>25
    else
    set @UserID=1000
    go

    -------------执行上面的存储过程----------------

    exec GetUserAccountRe '7',null

    解释:@UserName为输入参数,@UserID为输出参数。 运行结果为@userID为COOUT(*)即 =1。

    5. 同时具有返回值、输入参数、输出参数的存储过程

    复制代码 代码如下:

    -------------创建名为GetUserAccount的存储过程----------------

    create Procedure GetUserAccountRe1
    @UserName nchar(20),
    @UserID int output
    as
    if(@UserName>5)
    select @UserID=COUNT(*) from UserAccount where UserID>25
    else
    set @UserID=1000
    return @@rowcount
    go

    -------------执行上面的存储过程----------------

    exec GetUserAccountRe1 '7',null

    结果:@userID为COOUT(*)即 =1,Retun Value=1。

    6.同时返回参数和记录集的存储过程

    复制代码 代码如下:

    -------------创建名为GetUserAccount的存储过程----------------

    create Procedure GetUserAccountRe2
    @UserName nchar(20),
    @UserID int output
    as
    if(@UserName>5)
    select @UserID=COUNT(*) from UserAccount where UserID>25
    else
    set @UserID=1000
    select * from UserAccount
    return @@rowcount
    go

    -------------执行上面的存储过程----------------

    exec GetUserAccountRe2 '7',null

     结果:返回执行 select * from UserAccount 这句代码的结果集,同时@userID为COOUT(*)即 =1,Retun Value=9。

    7.返回多个记录集的存储过程

    复制代码 代码如下:

    -------------创建名为GetUserAccount的存储过程----------------

    create Procedure GetUserAccountRe3
    as
    select * from UserAccount
    select * from UserAccount where UserID>5
    go

    -------------执行上面的存储过程----------------

    exec GetUserAccountRe3

    结果:返回两个结果集,一个为 select * from UserAccount,另一个为 select * from UserAccount where UserID>5 。

    小结:上面我们创建了各式的存储过程,下面看我们在c#中怎样调用这些存储过程。

     c#调用存储过程

     这里调用的存储过程为上面我写的那些各式各样的存储过程。  

    复制代码 代码如下:

     View Code

    public partial class ProcedureTest : System.Web.UI.Page
        {
            public static  string conn = ConfigurationManager.ConnectionStrings["StuRelationDBConnectionString"].ConnectionString;
            public SqlConnection con = new SqlConnection(conn);
            protected void Page_Load(object sender, EventArgs e)
            {
                runGetUserAccountRe3();
            }

            //只返回单一记录集的存储过程GetUserAccount
            public void runGetUserAccount()
            {
                SqlDataAdapter dp = new SqlDataAdapter(common("GetUserAccount"));
                DataSet ds = new DataSet();
                // 填充dataset
                dp.Fill(ds);
                rpt.DataSource = ds;
                rpt.DataBind();

            }

            //没有输入输出的存储过程inUserAccount
            public void runinUserAccount()
            {           
                con.Open();
                Label1.Text = common("inUserAccount").ExecuteNonQuery().ToString();
                con.Close();
            }

            //有返回值的存储过程inUserAccountRe
            public void runinUserAccountRe()
            {
                // 创建参数
                SqlCommand cmd = common("inUserAccountRe");
                IDataParameter[] parameters = {
                     new SqlParameter("rval", SqlDbType.Int,4)
                 };
                // 将参数类型设置为 返回值类型
                parameters[0].Direction = ParameterDirection.ReturnValue;
                // 添加参数
                cmd.Parameters.Add(parameters[0]);
                con.Open();
                // 执行存储过程并返回影响的行数
                Label1.Text = cmd.ExecuteNonQuery().ToString();
                con.Close();
                // 显示影响的行数和返回值
                Label1.Text = "-" parameters[0].Value.ToString();
            }

            //有输入参数和输出参数的存储过程
            public void runGetUserAccountRe()
            {
                SqlCommand cmd = common("GetUserAccountRe");
                // 创建参数
                IDataParameter[] parameters = {
                     new SqlParameter("@UserName", SqlDbType.NChar,20) ,
                     new SqlParameter("@UserID", SqlDbType.Int) ,
                 };
                // 设置参数类型
                parameters[0].Value = "7"; 
                parameters[1].Direction = ParameterDirection.Output;  // 设置为输出参数
                // 添加参数
                cmd.Parameters.Add(parameters[0]);
                cmd.Parameters.Add(parameters[1]);
                con.Open();
                // 执行存储过程并返回影响的行数
                Label1.Text = cmd.ExecuteNonQuery().ToString();
                con.Close();          
                // 显示影响的行数和输出参数
                Label1.Text = "-" parameters[1].Value.ToString();

            }

            //同时具有返回值、输入参数、输出参数的存储过程GetUserAccountRe1
            public void runGetUserAccountRe1()
            {
                SqlCommand cmd = common("GetUserAccountRe1");
                // 创建参数
                IDataParameter[] parameters = {
                     new SqlParameter("@UserName", SqlDbType.NChar,20) ,
                     new SqlParameter("@UserID", SqlDbType.Int) ,
                     new SqlParameter("rval", SqlDbType.Int,4)
                 };
                // 设置参数类型
                parameters[0].Value = "7";
                parameters[1].Direction = ParameterDirection.Output;  // 设置为输出参数
                parameters[2].Direction = ParameterDirection.ReturnValue;  //设置为返回值
                // 添加参数
                cmd.Parameters.Add(parameters[0]);
                cmd.Parameters.Add(parameters[1]);
                cmd.Parameters.Add(parameters[2]);
                con.Open();
                // 执行存储过程并返回影响的行数
                Label1.Text = cmd.ExecuteNonQuery().ToString();
                con.Close();
                // 显示影响的行数和输出参数
                Label1.Text = "-输出参数为:" parameters[1].Value.ToString();
                Label1.Text = "-返回值为:" parameters[2].Value.ToString();

            }

            //同时返回参数和记录集的存储过程GetUserAccountRe2
            public void runGetUserAccountRe2()
            {
                SqlCommand cmd = common("GetUserAccountRe2");
                // 创建参数
                IDataParameter[] parameters = {
                     new SqlParameter("@UserName", SqlDbType.NChar,20) ,
                     new SqlParameter("@UserID", SqlDbType.Int) ,
                     new SqlParameter("rval", SqlDbType.Int,4)
                 };
                // 设置参数类型
                parameters[0].Value = "7";
                parameters[1].Direction = ParameterDirection.Output;  // 设置为输出参数
                parameters[2].Direction = ParameterDirection.ReturnValue;  //设置为返回值
                // 添加参数
                cmd.Parameters.Add(parameters[0]);
                cmd.Parameters.Add(parameters[1]);
                cmd.Parameters.Add(parameters[2]);
                con.Open();
                // 执行存储过程并返回影响的行数
                Label1.Text = cmd.ExecuteNonQuery().ToString();
                DataSet ds = new DataSet();
                SqlDataAdapter dt = new SqlDataAdapter(cmd);
                dt.Fill(ds);
                rpt.DataSource = ds;
                rpt.DataBind();
                con.Close();
                // 显示影响的行数和输出参数
                Label1.Text = "-输出参数为:" parameters[1].Value.ToString();
                Label1.Text = "-返回值为:" parameters[2].Value.ToString();

            }

            //返回多个记录集的存储过程
            public void runGetUserAccountRe3()
            {
                DataSet ds = new DataSet();
                SqlDataAdapter dt = new SqlDataAdapter(common("GetUserAccountRe3"));
                dt.Fill(ds);
                rpt1.DataSource = ds.Tables[0].DefaultView;
                rpt1.DataBind();
                rpt2.DataSource = ds.Tables[1].DefaultView;
                rpt2.DataBind();
            }

            public SqlCommand common(string proName)
            {

                SqlCommand cmd = new SqlCommand();
                // 设置sql连接
                cmd.Connection = con;           
                // 如果执行语句
                cmd.CommandText = proName;
                // 指定执行语句为存储过程
                cmd.CommandType = CommandType.StoredProcedure;
                return cmd;
            }
        }  

    附带SQLServer数据库的一些全局变量

    复制代码 代码如下:

    View Code

    select APP_NAME ( ) as w --当前会话的应用程序

    select @@IDENTITY   --返回最后插入的标识值
    select USER_新葡亰496net允许远程连接到此服务器,存储过程。NAME()    --返回用户数据库用户名

    SELECT @@CONNECTIONS  --返回自上次SQL启动以来连接或试图连接的次数。
    SELECT GETDATE() --当前时间
    SELECT @@CPU_BUSY/100  --返回自上次启动SQL 以来 CPU 的工作时间,单位为毫秒

    USE tempdb SELECT @@DBTS  as w  --为当前数据库返回当前 timestamp 数据类型的值。这一 timestamp 值保证在数据库中是唯一的。
    select @@IDENTITY as w --返回最后插入的标识值
    SELECT @@IDLE  as w  --返回SQL自上次启动后闲置的时间,单位为毫秒
    SELECT @@IO_BUSY AS w   --返回SQL自上次启动后用于执行输入和输出操作的时间,单位为毫秒
    SELECT @@LANGID AS w   --返回当前所使用语言的本地语言标识符(ID)。
    SELECT @@LANGUAGE AS w   --返回当前使用的语言名
    SELECT @@LOCK_TIMEOUT as w  --当前会话的当前锁超时设置,单位为毫秒。
    SELECT @@MAX_CONNECTIONS  as w  --返回SQL上允许的同时用户连接的最大数。返回的数不必为当前配置的数值
    EXEC sp_configure  --显示当前服务器的全局配置设置
    SELECT @@MAX_PRECISION as w --返回 decimal 和 numeric 数据类型所用的精度级别,即该服务器中当前设置的精度。默认最大精度38。
    select @@OPTIONS  as w  --返回当前 SET 选项的信息。
    SELECT @@PACK_RECEIVED as w  --返回SQL自启动后从网络上读取的输入数据包数目。
    SELECT @@PACK_SENT as w  --返回SQ自上次启动后写到网络上的输出数据包数目。
    SELECT @@PACKET_ERRORS as w  --返回自SQL启动后,在SQL连接上发生的网络数据包错误数。
    SELECT @@SERVERNAME as w --返回运行SQL服务器名称。
    SELECT @@SERVICENAME  as w --返回SQL正在其下运行的注册表键名
    SELECT @@TIMETICKS  as w --返回SQL服务器一刻度的微秒数
    SELECT @@TOTAL_ERRORS AS w  --返回 SQL服务器自启动后,所遇到的磁盘读/写错误数。
    SELECT @@TOTAL_READ  as w  --返回 SQL服务器自启动后读取磁盘的次数。
    SELECT @@TOTAL_WRITE as w  --返回SQL服务器自启动后写入磁盘的次数。
    SELECT @@TRANCOUNT  as w  --返回当前连接的活动事务数。
    SELECT @@VERSION as w  --返回SQL服务器安装的日期、版本和处理器类型。

    本文由新葡亰496net发布于网络数据库,转载请注明出处:新葡亰496net允许远程连接到此服务器,存储过程

    关键词: