GVKun编程网logo

sql-server – 从.NET可以获得由SqlCommand对象生成的完整SQL字符串(带有SQL参数)吗?

26

本文将为您提供关于sql-server–从.NET可以获得由SqlCommand对象生成的完整SQL字符串(带有SQL参数)吗?的详细介绍,同时,我们还将为您提供关于ADO.NET中有关SqlConn

本文将为您提供关于sql-server – 从.NET可以获得由SqlCommand对象生成的完整SQL字符串(带有SQL参数)吗?的详细介绍,同时,我们还将为您提供关于ADO.NET中有关SqlConnection与Sqlcommand 的介绍与应用、ADO.Net之SqlConnection、 Sqlcommand的应用(读书笔记1)、ADO.Net之SqlConnection、sqlcommand的应用、c# – IDbCommand MySQL和SQL Server的命名参数的实用信息。

本文目录一览:

sql-server – 从.NET可以获得由SqlCommand对象生成的完整SQL字符串(带有SQL参数)吗?

sql-server – 从.NET可以获得由SqlCommand对象生成的完整SQL字符串(带有SQL参数)吗?

从.NET环境中,我可以访问由 SqlCommand对象生成的完整sql字符串吗?

注意:在调试模式下,完整的sql字符串显示在VisualStudio中的Intellisense悬停中.

如果必须,我愿意使用反射技术.我相信这里有人知道一种方法来实现它.

更新1:
我正在调用具有cmd.CommandType = CommandType.StoredProcedure参数的存储过程,并且我正在尝试获取生成并运行的完整sql.
我想知道cmd.Prepare()方法在这种情况下是否有用,如果它可能将完整的字符串存储在状态字段或类似的东西中.

更新2:

根据下面的答案(和引用)表明在准备或执行过程中没有内部生成完整的sql字符串,我做了一些使用.NET Reflector.即使是内部连接类似乎也会传递对象而不是将它们归结为字符串,例如:

内部抽象void AddPreparedCommand(sqlCommand cmd);
声明类型:System.Data.sqlClient.sqlInternalConnection
汇编:System.Data,Version = 2.0.0.0

总的来说,感谢每个人的细节水平,以证明可以做什么,并展示实际发生的事情.非常感激.我喜欢彻底的解释;他们增加了保证,并为答案提供了信任.

解决方法

一个简单的循环用它们的值替换所有参数名称将为您提供类似于最终结果的东西,但是有几个问题.

>由于sql实际上从未使用参数值进行重建,因此不需要考虑换行和引号等内容
>注释中的参数名称从不实际处理其值,而是保持原样

有了这些参数,并考虑了以相同字符开头的参数名称,如@NAME和@NAME_FULL,我们可以将所有参数名称替换为该参数所在的值:

string query = cmd.CommandText;
foreach (sqlParameter p in cmd.Parameters.OrderByDescending(p => p.ParameterName.Length))
{
    query = query.Replace(p.ParameterName,p.Value.ToString());
}

但是,还有一个问题,那就是如果参数是一个字符串,那么sql最初看起来像这样:

SELECT * FROM yourtable WHERE table_code = @CODE

将如下所示:

SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES

这显然不是合法的sql,所以我们也需要考虑一些参数类型:

DbType[] quotedParameterTypes = new DbType[] {
    DbType.AnsiString,DbType.Date,DbType.DateTime,DbType.Guid,DbType.String,DbType.AnsiStringFixedLength,DbType.StringFixedLength
};
string query = cmd.CommandText;

var arrParams = new sqlParameter[cmd.Parameters.Count];
cmd.Parameters.copyTo(arrParams,0);

foreach (sqlParameter p in arrParams.OrderByDescending(p => p.ParameterName.Length))
{
    string value = p.Value.ToString();
    if (quotedParameterTypes.Contains(p.DbType))
        value = "'" + value + "'";
    query = query.Replace(p.ParameterName,value);
}

ADO.NET中有关SqlConnection与Sqlcommand 的介绍与应用

ADO.NET中有关SqlConnection与Sqlcommand 的介绍与应用

ADO.NET中有关SqlConnection与Sqlcommand 的介绍与应用

思维导图:

 

ADO.NET提供5个主要的类的对象来实现数据的连接访问和离线访问。这5个类分别是Connection、Command、DataReader、DataAdapter和DataSet。

SqlConnection 的介绍与应用

1、介绍与作用

SqlConnection是ADO.NET中的连接类。

 使用sqlconnection 类可以连接到SQL  Server数据库。

2、主要属性以及方法

   主要属性:ConnectionString(连接字符串)

   其它属性简介:

属性

说明

ClientConnectionId

最近连接尝试连接的 ID,无论该尝试是成功还是失败。

ConnectionTimeout

获取在尝试建立连接时终止尝试并生成错误之前所等待的时间。 (重写 DbConnectionConnectionTimeout。)

Container

获取 IContainer,它包含 Component。 (继承自 Component。)

Credential

获取或设置此连接的 SqlCredential 对象。

Database

获取当前数据库或连接打开后要使用的数据库的名称。 (重写 DbConnectionDatabase。)

DataSource

获取要连接的 SQL Server 实例的名称。 (重写 DbConnectionDataSource。)

FireInfoMessageEventOnUserErrors

获取或设置 FireInfoMessageEventOnUserErrors 属性。

PacketSize

用来与 SQL Server 的实例进行通信的网络数据包的大小,以字节为单位。

ServerVersion

获取包含客户端连接的 SQL Server 实例的版本的字符串。 (重写 DbConnectionServerVersion。)

Site

获取或设置 Component 的 ISite。 (继承自 Component。)

State

指示最近在连接上执行网络操作时, SqlConnection 的状态。 (重写 DbConnectionState。)

StatisticsEnabled

如果设置为 true,则对当前连接启用统计信息收集。

WorkstationId

获取标识数据库客户端的一个字符串。

方法:Open();(打开数据库)  Close();(关闭数据库)

构造函数:

名称

说明

SqlConnection

初始化 SqlConnection 类的新实例。

SqlConnection(String)

如果给定包含连接字符串的字符串,则初始化 SqlConnection 类的新实例。

SqlConnection(String, SqlCredential)

初始化给定连接字符串的 SqlConnection 类的新实例,而不使用包含用户识别号和密码的 Integrated Security = true 和 SqlCredential 对象。

 

3、创建SqlConnection对象:

  可以使用定义好的连接字符串创建SqlConnection对象。代码如下

  SqlConnection  connection=new  SqlConnection(connectionString);

要访问数据源,必须先建立连接。这个连接对象里描述了数据库服务器类型、数据库的名字、用户名、密码等参数。

 SqlConnection  conn=new  SqlConnection();

conn.ConnectionString=”Data Source=(Local);

Initial  Catalog=pubs;  uid=sa;  pwd=sa;”

调用SqlConnection 对象的Open()与Close() 方法来打开和关闭数据库的代码如下:

打开数据库:connection.Open();

关闭数据库:connection.Close();

 

SqlCommand的介绍与应用

  SqlCommand属于命令类

1、作用:

 SqlCommand 对象用于执行具体的SQL语句,如增加、删除、修改、查找。

2、主要属性以及方法

SqlCommand对象的常用属性

属  性

说  明

Connection属性

指定Command对象所使用的Connection对象。

CommandType属性

指定Command对象的类型,有3种选择:

1 Text:表示Command对象用于执行SQL语句。

2 StoredProcedure:表示Command对象用于执行存储过程。

3 TableDirect:表示Command对象用于直接处理某个表。

CommandType属性的默认值为Text

CommandText属性

根据CommandType属性的取值来决定CommandText属性的取值,分为3种情况:

1 如果CommandType属性取值为Text,则CommandText属性指出SQL语句的内容

2 如果CommandType属性取值为StoredProcedure,则CommandText属性指出存储过程的名称

3 如果CommandType属性取值为TableDirect,则CommandText属性指出表的名称

CommandText属性的默认值为SQL语句

CommandTimeout属性

指定Command对象用于执行命令的最长延迟时间,以秒为单位,如果在指定时间内仍不能开始执行命令,则返回失败信息。

默认值为30秒。

Parameters属性

指定一个参数集合。

SqlCommand对象的重要方法:

方法

说明

ExecuteScalar

执行查询,并返回查询结果中的第一行第一列的值,类型是object

ExecuteNonQuery

执行SQL语句并返回受影响的行数

ExecuteReader

执行查询命令,返回SqlDataReader对象

 

3、SqlCommand对象的使用步骤如下

(1)创建SqlConnection对象

 SqlConnection  connection=new  SqlConnection(connectionString);

(2)定义SQL语句

 把所要执行的SQL语句赋给字符串。

(3)创建SqlCommand对象

  SqlCommand command = new SqlCommand();

(4)调用SqlCommand对象的某个方法,执行SQL语句。

 注意在调用SqlCommand 对象的某个方法之前,一定要打开数据库连接,否则程序会出错

举例如下:

public partial class Form1 : Form

    {

        //数据库连接字符串       

        private static string connString = "Data Source=localhost;Initial Catalog=QQ;Integrated Security=true";

        //数据库连接对象

        public static SqlConnection connection = new SqlConnection(connString);

        public Form1()

        {

            InitializeComponent();

        }

        //执行SQL语句

        private void btnSql_Click(object sender, EventArgs e)

        {

            try

            {

                //查询用的 SQL 语句

                string selectSql = "select count(*) from Users";

                //创建Command对象

                SqlCommand command = new SqlCommand();

                //指定Command对象所使用的Connection对象

                command.Connection = connection;

                //指定Command对象用于执行SQL语句

                command.CommandType = CommandType.Text;

                //指定要执行的SQL语句

                command.CommandText = selectSql;        

                //打开数据库连接

                connection.Open();

                //执行查询操作,返回单个值

                this.txtCount.Text = command.ExecuteScalar().ToString();

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                //关闭数据库连接

                connection.Close();

            }

        }

        //执行存储过程

        private void btnStoreProc_Click(object sender, EventArgs e)

        {

            try

            {

                //创建Command对象

                SqlCommand command = new SqlCommand();

                //指定Command对象所使用的Connection对象

                command.Connection = connection;

                //指定Command对象用于执行存储过程

                command.CommandType = CommandType.StoredProcedure;

                //指定要执行的存储过程的名称

                command.CommandText = "procSelect1";               

                //打开数据库连接

                connection.Open();

                //执行查询操作,返回单个值

                this.txtCount.Text = command.ExecuteScalar().ToString();

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

            finally

            {

                //关闭数据库连接

                connection.Close();

            }

        }

}

 

ADO.Net之SqlConnection、 Sqlcommand的应用(读书笔记1)

ADO.Net之SqlConnection、 Sqlcommand的应用(读书笔记1)

一.思维导图

1.关于SqlConnection类。

属性 ConnectionString 获取或设置用于打开 SQL Server 数据库的字符串。 方法 0pen() 使用 ConnectionString 所指定的属性设置打开数据库连接。   Close() 关闭与数据库的连接。 此方法是关闭任何已打开连接的首选方法。   CreateCommand() 创建并返回一个与 SqlConnection 关联的 SqlCommand 对象。

 

 

 

 

 

2.关于SqlCommand类。

属性 Connection 获取或设置SqlCommand的实例使用的SqlConnection。
  CommandText 获取或设置要对数据源执行的Transact—SQL语句或存储过程。
  CommandType 获取或设置一个值,该值指示如何解释CommandText属性。
  Parameters 参数化查询
方法 ExecuteNonQuery() 返回值类型为int型。多用于执行增加,删除,修改数据。返回受影响的行数
  ExecuteReader() 返回类型为SqlDataReader。此方法用于用户进行的查询操作。使用SqlDataReader对象的Read();方法进行逐行读取。
  ExecuteScalar() 返回值类型多为int类型。它返回的多为执行select查询。得到的返回结果为一个值的情况,比如使用count函数求表中记录个数或者使用sum函数求和等。

 

 

 

 

 

 

二.实例(实现登录)

1.声明并实例化SQL连接,并在字符串变量sqlConnection中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证)

1 SqlConnection sqlConnection = new SqlConnection();                              
2 SqlConnection.ConnectionString ="Server=(local);Database=EduBaseDemo;Integrated Security=sspi";

2. Sqlcommand---Connection、CommandText

1  SqlCommand sqlCommand = new SqlCommand();                                       //声明并实例化SQL命令;
2  sqlCommand.Connection = sqlConnection;                                          //将SQL命令的属性Connection指向SQL连接;
3      sqlCommand.CommandText =                                                        //指定SQL命令的命令文本;命令文本由字符串拼接而成;
4                 "SELECT COUNT(1) FROM tb_User"
5                 + " WHERE No=''" + this.txb_UserNo.Text.Trim() + "''"                         //将文本框的文本清除首尾的空格后,拼接至命令文本中;
6                 + " AND Password=HASHBYTES(''MD5'',''" + this.txb_Password.Text.Trim() + "'');";

3.SqlCommand---ExecuteScalar

 1 sqlConnection.Open();                                                           //打开SQL连接;
 2       int rowCount = (int)sqlCommand.ExecuteScalar();                           //调用SQL命令的方法ExecuteScalar来执行命令,并接受单个结果(即标量);
 3                                                                                 //执行标量的返回结果类型为object,可通过强制类型转换,转为整型;
 4       sqlConnection.Close();                                                    //关闭SQL连接;
 5        if (rowCount == 1)                                                       //若查得所输用户号相应的1行记录;
 6          {
 7             MessageBox.Show("登录成功。");                                       //给出正确提示;
 8          }
 9        else                                                                    //否则;
10          {
11             MessageBox.Show("用户号/密码有误,请重新输入!");                      //给出错误提示;
12             this.txb_Password.Focus();                                         //密码文本框获得焦点;
13             this.txb_Password.SelectAll(); }                                  //密码文本框内所有文本被选中;

 

ADO.Net之SqlConnection、sqlcommand的应用

ADO.Net之SqlConnection、sqlcommand的应用

在ADO.NET中,有两种操作数据库的方式:
1.无连接的方式;2.保持连接的方式。不论采用哪种方式,都可以通过SqlCommand对象提供的方法传递对数据库操作的命令,并返回命令执行的结果。在保持连接的方式下操作数据库的一般步骤为:1.创建SqlConnection的实例;2.创建SqlCommand的实例;3.打开连接;4.执行命令;5.关闭连接。

 SqlConnection对象可以连接到SQL server数据库。

连接数据库主要分为以下3步

(1)定义连接字符串

(2)创建SqlConnection

  (3)打开数据库连接

代码:

 string connstring @"Data Sourcen.\sqlexpress: Initial Catalog=AddressList;Integrated
Security=True”;
Sqlconnection connection- new sqlconnection(connstring);
connection Open();
MessageBox. Show(“打开数据库连接成功");
connection Close();
MessageBox. Show("关闭数据库连接成功”); 

 

 

 

SqlCommand对象用于执行具体的SQL语句,如增加、删除、修改、查找。SqlCommand对象的使用步骤如下。

创建SqlConnection对象。

定义SQL语句。

创建SqlCommand对象。

调用SqlCommand对象的某个方法,执行SQL语句。

相关代码

private void btnLogin_click (object sender, EventArgs e)

{
         if (txtUserName.Text.Trim()==“”|| txtUserPassword.Tex.Trim()==””)
         }      

MessageBox. Show("用户名或密码不能为空!”);
         txtUserName. Focus();
         return;
}

string connstring = @"Data Source=.\sqlexpress; Initial
Catalog-AddressList: Integrated Security=True”;
         string sqlstr= string. Format("select *from{User} where UserName=’{0}’
and Password(1)''”, txtUserName. Text. Trim(), txtUserPassword.Text.Trim();
         using(SqlConnection conn=new Sqlconnection(connstring))

{
SqICommand cmd=new SqlCommand(sqlstr, conn);

conn open();
sqlDataReader sdr= cmd.ExecuteReader();
if(sdr.Read())

}
         MessageBox.Show("登录成功!“);

}

Else

{
                  MessageBox,Show("用户名或密码错误,请重新输入!”,“错误");
                  txtuserPassword.Text=””;
                txtUserName. Focus();

}
         sdr Close();

}

}

 




 

c# – IDbCommand MySQL和SQL Server的命名参数

c# – IDbCommand MySQL和SQL Server的命名参数

我一直在尝试创建一些DB独立代码,如下所示:

IDbCommand command = connection.CreateCommand();
command.CommandText = "...";

IDbDataParameter param1 = command.CreateParameter();
param1.ParameterName = "param1";
param1.Value = "value";
command.Parameters.Add(param1);

适用于MysqL的命令文本是:

select * from mytable where field1 = ?param1

适用于sqlserver的命令文本是:

select * from mytable where field1 = @param1

是否有某种形式适用于两者?

编辑:

> sql Server 2008R2
> MysqL 5.0.X

解决方法

不,我认为没有这样的方法.所以你必须提供自己的:

public static String GetProviderParameter(string paramName,IDbConnection con)
{
    string prefix = "";
    if(con is System.Data.sqlClient.sqlConnection)
        prefix = "@";
    else if(con is System.Data.OleDb.OleDbConnection)
        prefix =  "?";
    else if(con is System.Data.Odbc.OdbcConnection)
        prefix =  "?";
    else if(con is MysqL.Data.MysqLClient.MysqLConnection)
        prefix =  "?";

    return prefix + paramName;
}

用法:

param1.ParameterName = GetProviderParameter("param1",connection);

或者您可以使用this扩展,它使用反射来使用DbCommandBuilder类中的受保护方法GetParameterName:

public static class Db
{
    static readonly Func<DbConnection,DbProviderFactory> getDbProviderFactory = 
        (Func<DbConnection,DbProviderFactory>)Delegate.CreateDelegate(typeof(Func<DbConnection,DbProviderFactory>),typeof(DbConnection).GetProperty("DbProviderFactory",BindingFlags.Instance | BindingFlags.NonPublic).Getgetmethod(true));
    static readonly Func<DbCommandBuilder,string,string> getParameterName =
        (Func<DbCommandBuilder,string>)Delegate.CreateDelegate(typeof(Func<DbCommandBuilder,string>),typeof(DbCommandBuilder).getmethod("GetParameterName",BindingFlags.Instance | BindingFlags.NonPublic,Type.DefaultBinder,new Type[] { typeof(string) },null));

    public static DbProviderFactory GetProviderFactory(this DbConnection connection)
    {
        return getDbProviderFactory(connection);
    }

    public static string GetParameterName(this DbConnection connection,string paramName)
    {
        DbCommandBuilder builder = GetProviderFactory(connection).CreateCommandBuilder();

        return getParameterName(builder,paramName);
    }
}

然后它很简单:

param1.ParameterName = connection.GetParameterName("param1");

今天关于sql-server – 从.NET可以获得由SqlCommand对象生成的完整SQL字符串(带有SQL参数)吗?的介绍到此结束,谢谢您的阅读,有关ADO.NET中有关SqlConnection与Sqlcommand 的介绍与应用、ADO.Net之SqlConnection、 Sqlcommand的应用(读书笔记1)、ADO.Net之SqlConnection、sqlcommand的应用、c# – IDbCommand MySQL和SQL Server的命名参数等更多相关知识的信息可以在本站进行查询。

本文标签: