GVKun编程网logo

如何获取由.Net(VB或C#)中的参数化查询实际执行的SQL?

15

如果您对如何获取由.Net感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于如何获取由.Net的详细内容,我们还将为您解答VB或C#中的参数化查询实际执行的SQL?的相关问题,

如果您对如何获取由.Net感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于如何获取由.Net的详细内容,我们还将为您解答VB或C#中的参数化查询实际执行的SQL?的相关问题,并且为您提供关于.net – 我可以在不实际执行的情况下测试LINQ查询的构造、ACCESS的参数化查询,附VBSCRIPT(ASP)和C#(ASP.NET)函数、ACCESS的参数化查询,附VBSCRIPT(ASP)和C#(ASP.NET)函数第1/2页、ArcGIS JavaScript API 中的参数化查询的有价值信息。

本文目录一览:

如何获取由.Net(VB或C#)中的参数化查询实际执行的SQL?

如何获取由.Net(VB或C#)中的参数化查询实际执行的SQL?

是否有直接方法查看DbCommand对象实际对基础数据库实际执行的SQL命令文本(即,在将参数处理为语句之后)?

详细信息在这里:我正在使用VB.Net
3.5,并具有一个工厂对象(DbProviderFactory)和一个连接(System.Data.IDbConnection)。我正在使用工厂使用该DbProviderFactory.CreateCommand()方法创建新的命令对象,然后将参数化查询分配给CommandText命令的属性。稍后,我创建一些参数并将其与查询关联(使用来创建DbProviderFactory)。

很好,但是我想看看命令对象生成的实际SQL语句。我目前正在针对SQLite数据库进行测试,但想知道是否有一种通用的方法行得通。

答案1

小编典典

服务器执行的实际SQL就是您编写的。参数是与命令本身分开发送的,因此实际上从不将其替换为SQL命令中的值。

.net – 我可以在不实际执行的情况下测试LINQ查询的构造

.net – 我可以在不实际执行的情况下测试LINQ查询的构造

我听说在测试EF时,由于LINQ to Objects和LINQ to Entities提供程序之间的差异,您需要对实时DB使用集成测试.

为什么我们不能在没有实际执行的情况下对查询的构造进行单元测试?我原本以为你可以将你的IQueryable以某种方式附加到LINQ to Entities提供程序并确认sql是否正确生成(使用ToTraceString这样不执行实际查询的东西).

我想象沿着这些行的代码(这个查询在L2O中运行良好但在L2E中运行不正常):

<test()> _
    Public Sub Query_Should_Build_Against_L2E()
        Dim testQuery = From d In myDb
                        Where d.Status = CType(Status.Ready,Integer)

        testQuery.SetQueryProvider("L2E")

        Assert.DoesNotthrow(testQuery.ToTraceString())
    End Sub

编辑

我尝试实现GertArnold的解决方案如下:

Dim context As New Context("Data Source=fakedbserver;Initial Catalog=fakedb;Persist Security Info=True;")
Dim result = context.myTable.Where(Function(d) d.Status=True)

抛出ProviderIncompatibleException,并显示消息“从数据库获取提供程序信息时发生错误.这可能是由于实体框架使用不正确的连接字符串引起的.检查内部异常以获取详细信息并确保连接字符串正确.”这是完整的异常链:

System.Data.ProviderIncompatibleException : An error occurred while getting provider information from the database. This can be caused by Entity Framework using an incorrect connection string. Check the inner exceptions for details and ensure that the connection string is correct.

System.Data.ProviderIncompatibleException : The provider did not return a ProviderManifestToken string.

system.invalidOperationException : This operation requires a connection to the ‘master’ database. Unable to create a connection to the ‘master’ database because the original database connection has been opened and credentials have been removed from the connection string. Supply an unopened connection.

System.Data.sqlClient.sqlException : A network-related or instance-specific error occurred while establishing a connection to sql Server. The server was not found or was not accessible. Verify that the instance name is correct and that sql Server is configured to allow remote connections. (provider: Named Pipes Provider,error: 40 – Could not open a connection to sql Server)

解决方法

attach your IQueryable to the LINQ to Entities provider

问题是:哪个IQueryable?接口本身就没有了.使用EF,你正在处理实现IQueryable的类,但除此之外还要做更多.事实上,他们完全有能力与已经连接在引擎盖下的上下文和查询提供程序合作. IQueryable.IQueryProvider是一个只读属性,因此它由工厂设置,用于创建特定的IQueryable实现.

因此,您的testQuery将是一个ObjectQuery,因为它取自myDb,它不能是EF上下文.

Why can’t we unit test the construction of the query without actually executing it?

这不是你的实际问题吗?事实上,我甚至想知道你是否想要一个不同的查询提供者.我想你会希望EF查询提供程序这样做,否则仍然不能保证与EF一样工作.

无论如何,你可以在它的连接字符串中创建一个带有假数据库名称的上下文(以确保它不连接),并检查((ObjectQuery)testQuery).ToTraceString()的有效性.只要你不迭代testQuery就没关系.我可以想象,当在复杂的执行路径中组合查询时,这种测试有一些价值. (但我宁愿避免这种情况).

ACCESS的参数化查询,附VBSCRIPT(ASP)和C#(ASP.NET)函数

ACCESS的参数化查询,附VBSCRIPT(ASP)和C#(ASP.NET)函数

最近因项目需要用ACCESS做数据库开发WEB项目
看论坛上还许多人问及ACCESS被注入的安全问题
许多人解决的方法仍然是用Replace替换特殊字符,然而这样做也并没有起到太大做用
今天我就把我用ACCESS参数化查询的一些方法和经验和大家分享
希望对大家有所启发,有写的不对的地方希望高手们多多指教

ASP.NET 用OleDbCommand的new OleDbParameter创建参数货查询
ASP用Command的CreateParameter 方法创建参数化查询
(sql储存过程查询也是用这个方法建立的)

ASP.NET C#语法
----------------------------------------------------------------------------

复制代码 代码如下:

OleDbParameter parm = new OleDbParameter(Name, Type, Direction, Size, Value);
(实际上它有七重载大家具体大家可以在VS.net里面就可以看到)
参数
Name        可选,字符串,代表 Parameter 对象名称。
Type        可选,长整型值,指定 Parameter 对象数据类型。
Direction   可选,长整型值,指定 Parameter 对象类型。。
Size        可选,长整型值,指定参数值最大长度(以字符或字节数为单位)。
Value       可选,变体型,指定 Parameter 对象的值。
以下是实例,查询news表中所有tsing发表的新闻
  -------------------------------------------------------
  sql="select * from newss where username=? order by id"
 //注意查询的条件均用?号表示
  OleDbConnection conn = new OleDbConnection(connString);
  OleDbCommand cmd = new OleDbCommand(sql,conn); 
  OleDbParameter parm = new OleDbParameter("temp",OleDbType.VarChar, 50);
  //temp为Parameter对象可随便定义,OleDbType.VarChar指定为字符串,长度50
  parm.Direction = ParameterDirection.Input;
  //指定其类型输入参数
  cmd.Parameters.Add(parm);
 cmd.Parameters["temp"].Value = "tsing";
  //查询tsing,也可以写成cmd.Parameters[0]
 conn.open();
 cmd.ExecuteReader();

----------------------------------------------------------------------------
ASP VBSCRIPT语法
----------------------------------------------------------------------------

复制代码 代码如下:

Set parameter = command.CreateParameter (Name, Value)
参数同上
以下是实例,查询news表中所有tsing发表的新闻
  ------------------------------------------------------
  et conn = Server.CreateObject("Adodb.Connection")
  conn.ConnectionString = connString
  conn.open()
  set mycmd = Server.CreateObject("ADODB.Command")
  mycmd.ActiveConnection=conn
  mycmd.CommandText=sql
  mycmd.Prepared = true
  set mypar = mycmd.CreateParameter("temp",129,1,50,"tsing")
  mycmd.Parameters.Append mypar
  set myrs = mycmd.Execute

---------------------------------------------------------------------------
与上面基本相同不同的地方法是asp在对参数的表达上面不同
  129为adChar,1就是指示输入参数(是其实是默认值)
大家请参阅MICROSOFT的ADOVB.Inc:

复制代码 代码如下:

  '----   ParameterDirectionEnum   Values   ----   
  Const   adParamUnkNown   =   0   
  Const   adParamInput   =   1   
  Const   adParamOutput   =   2   
  Const   adParamInputOutput   =   3   
  Const   adParamReturnValue   =   4  
'----   DataTypeEnum   Values   ----   
  Const   adEmpty   =   0   
  Const   adtinyint   =   16   
  Const   adSmallInt   =   2   
  Const   adInteger   =   3   
  Const   adBigInt   =   20   
  Const   adUnsignedtinyint   =   17   
  Const   adUnsignedSmallInt   =   18   
  Const   adUnsignedInt   =   19   
  Const   adUnsignedBigInt   =   21   
  Const   adSingle   =   4   
  Const   adDouble   =   5   
  Const   adCurrency   =   6   
  Const   adDecimal   =   14   
  Const   adNumeric   =   131   
  Const   adBoolean   =   11   
  Const   adError   =   10   
  Const   adUserDefined   =   132   
  Const   adVariant   =   12   
  Const   adIdispatch   =   9   
  Const   adIUnkNown   =   13   
  Const   adGUID   =   72   
  Const   adDate   =   7   
  Const   adDBDate   =   133   
  Const   adDBTime   =   134   
  Const   adDBTimeStamp   =   135   
  Const   adBSTR   =   8   
  Const   adChar   =   129   
  Const   adVarChar   =   200   
  Const   adLongVarChar   =   201   
  Const   adWChar   =   130   
  Const   adVarWChar   =   202   
  Const   adLongVarWChar   =   203   
  Const   adBinary   =   128   
  Const   adVarBinary   =   204   
  Const   adLongVarBinary   =   205 

当前1/2页 12下一页阅读全文

ACCESS的参数化查询,附VBSCRIPT(ASP)和C#(ASP.NET)函数第1/2页

ACCESS的参数化查询,附VBSCRIPT(ASP)和C#(ASP.NET)函数第1/2页

ACCESS的参数化查询,附VBSCRIPT(ASP)和C#(ASP.NET)函数

最近因项目需要用ACCESS做数据库开发WEB项目
看论坛上还许多人问及ACCESS被注入的安全问题
许多人解决的方法仍然是用Replace替换特殊字符,然而这样做也并没有起到太大做用
今天我就把我用ACCESS参数化查询的一些方法和经验和大家分享
希望对大家有所启发,有写的不对的地方希望高手们多多指教

ASP.NET 用OleDbCommand的new OleDbParameter创建参数货查询
ASP用Command的CreateParameter 方法创建参数化查询
(SQL储存过程查询也是用这个方法建立的)

ASP.NET C#语法
----------------------------------------------------------------------------

代码如下:
OleDbParameter parm = new OleDbParameter(Name, Type, Direction, Size, Value);
(实际上它有七重载大家具体大家可以在VS.net里面就可以看到)
参数
Name 可选,字符串,代表 Parameter 对象名称。
Type 可选,长整型值,指定 Parameter 对象数据类型。
Direction 可选,长整型值,指定 Parameter 对象类型。。
Size 可选,长整型值,指定参数值最大长度(以字符或字节数为单位)。
Value 可选,变体型,指定 Parameter 对象的值。
以下是实例,查询news表中所有tsing发表的新闻
-------------------------------------------------------
sql="select * from newss where username=? order by id"
 //注意查询的条件均用?号表示
OleDbConnection conn = new OleDbConnection(connString);
OleDbCommand cmd = new OleDbCommand(sql,conn);
OleDbParameter parm = new OleDbParameter("temp",OleDbType.VarChar, 50);
//temp为Parameter对象可随便定义,OleDbType.VarChar指定为字符串,长度50
parm.Direction = ParameterDirection.Input;
//指定其类型输入参数
cmd.Parameters.Add(parm);
 cmd.Parameters["temp"].Value = "tsing";
//查询tsing,也可以写成cmd.Parameters[0]
 conn.Open();
 cmd.ExecuteReader();

----------------------------------------------------------------------------
ASP VBSCRIPT语法
----------------------------------------------------------------------------

代码如下:
Set parameter = command.CreateParameter (Name, Type, Direction, Size, Value)
参数同上
以下是实例,查询news表中所有tsing发表的新闻
------------------------------------------------------
et conn = Server.CreateObject("Adodb.Connection")
conn.ConnectionString = connString
conn.open()
set mycmd = Server.CreateObject("ADODB.Command")
mycmd.ActiveConnection=conn
mycmd.CommandText=sql
mycmd.Prepared = true
set mypar = mycmd.CreateParameter("temp",129,1,50,"tsing")
mycmd.Parameters.Append mypar
set myrs = mycmd.Execute

---------------------------------------------------------------------------
与上面基本相同不同的地方法是asp在对参数的表达上面不同
129为adChar,1就是指示输入参数(是其实是默认值)
大家请参阅MICROSOFT的ADOVB.Inc:

代码如下:
''---- ParameterDirectionEnum Values ----
Const adParamUnknown = 0
Const adParamInput = 1
Const adParamOutput = 2
Const adParamInputOutput = 3
Const adParamReturnValue = 4
''---- DataTypeEnum Values ----
Const adEmpty = 0
Const adTinyInt = 16
Const adSmallInt = 2
Const adInteger = 3
Const adBigInt = 20
Const adUnsignedTinyInt = 17
Const adUnsignedSmallInt = 18
Const adUnsignedInt = 19
Const adUnsignedBigInt = 21
Const adSingle = 4
Const adDouble = 5
Const adCurrency = 6
Const adDecimal = 14
Const adNumeric = 131
Const adBoolean = 11
Const adError = 10
Const adUserDefined = 132
Const adVariant = 12
Const adIDispatch = 9
Const adIUnknown = 13
Const adGUID = 72
Const adDate = 7
Const adDBDate = 133
Const adDBTime = 134
Const adDBTimeStamp = 135
Const adBSTR = 8
Const adChar = 129
Const adVarChar = 200
Const adLongVarChar = 201
Const adWChar = 130
Const adVarWChar = 202
Const adLongVarWChar = 203
Const adBinary = 128
Const adVarBinary = 204
Const adLongVarBinary = 205

ArcGIS JavaScript API 中的参数化查询

ArcGIS JavaScript API 中的参数化查询

如何解决ArcGIS JavaScript API 中的参数化查询?

我正在尝试在 ArcGIS JavaScript API 中为 ArcGIS 图层查询构建 where 子句。我能找到的所有示例(包括在 where documentation 中)都鼓励您这样做:

query.where = "NAME = ''" + stateName + "''";

我觉得这令人惊讶,因为我们似乎被鼓励编写易受 SQL injection bugs 影响的代码。这对我来说尤其重要,因为我的“stateName”完全不在我的控制范围内。这是原始用户输入。

看起来该库支持通过 parameterValues 属性进行查询参数化,但是我找不到有关如何使用它的示例,或者如何格式化我的查询以使其使用参数值。甚至文档也不包含任何示例。

那么我们如何创建正确参数化的查询?

旁注:我知道服务器管理员的工作可能是防止错误的查询造成损害,但是我问这个问题的一半原因也纯粹是为了避免错误和不正确解析的查询。

解决方法

According to ESRI,parameterValues 属性仅用于使用查询层。它不适用于此上下文。

所以答案是,不,当您只是在图层上运行查询时,您不能使用正确的 SQL 参数化。

我发现让您的查询至少更防弹的最好方法是使用这样的代码:

function sanitizeParameter(value) {
    // We need to escape single quotes to avoid messing up SQL syntax.
    // So all '' characters need to become ''''
    return value.split("''").join("''''")
}

query.where = "NAME = ''" + sanitizeParameter(stateName) + "''";

关于如何获取由.NetVB或C#中的参数化查询实际执行的SQL?的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于.net – 我可以在不实际执行的情况下测试LINQ查询的构造、ACCESS的参数化查询,附VBSCRIPT(ASP)和C#(ASP.NET)函数、ACCESS的参数化查询,附VBSCRIPT(ASP)和C#(ASP.NET)函数第1/2页、ArcGIS JavaScript API 中的参数化查询的相关信息,请在本站寻找。

本文标签:

上一篇如何基于MYSQL中的日期获取记录(如何基于mysql中的日期获取记录数据)

下一篇sql查询获取从一月到当月的所有数据,即使没有记录(sql获取上个月的数据)