本文将为您提供关于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参数)吗?
- 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字符串显示在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提供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)
一.思维导图
1.关于SqlConnection类。
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中,有两种操作数据库的方式:
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的命名参数
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的命名参数等更多相关知识的信息可以在本站进行查询。
本文标签: