我正在使用C#对SQL Server 2005实例进行参数化查询,我想看一下针对数据库运行的SQL以进行调试.在某些地方我可以查看参数化命令的输出SQL是在数据库日志中还是在Visual Studio调试器中?
我正在尝试在C#中的循环中插入数据库记录.
它在我硬编码这样的值时起作用:
string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (222,333);";
SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3);
sqlConnection3.Open();
for (int i = 0; i < arrItemsPlanner.Length; i++)
{
try
{
cmd3.ExecuteNonQuery();
}
catch
{
return "Error: Item could not be saved";
}
finally
{
//Fail
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我使用参数化查询时,它不起作用 - 即使我将值硬编码到参数化查询中,如下所示:
string query3 = "INSERT INTO furniture (room_id,member_id) VALUES (@room_id,333);";
SqlCommand cmd3 = new SqlCommand(query3, sqlConnection3);
sqlConnection3.Open();
for (int i = 0; i < arrItemsPlanner.Length; i++)
{
try
{
cmd3.Parameters.Add("@room_id", System.Data.SqlDbType.Int); …Run Code Online (Sandbox Code Playgroud) 我希望能够使用使用表值参数的实体框架构建参数化的临时 SQL 查询。
注意:引起我兴趣的用例是在给定 ID 列表的情况下查询多个实体。我希望查询计划程序能够在可能的情况下缓存计划,但我不一定要创建存储过程。
假设我有一些 id:
IEnumerable<int> ids = new [] {0, 42, -1};
Run Code Online (Sandbox Code Playgroud)
如果我编写一个 EF 查询,例如
context.MyEntities
.Where(e => ids.Contains(e.Id))
Run Code Online (Sandbox Code Playgroud)
生成的 sql未参数化,如下所示:
SELECT
[Extent1].[Name] AS [Name]
FROM [MyEntities] AS [Extent1]
WHERE [Extent1].[Id] IN (0, 42, -1)
Run Code Online (Sandbox Code Playgroud)
我想要得到的是类似的东西
SELECT
[Extent1].[Name] AS [Name]
FROM [MyEntities] AS [Extent1]
WHERE EXISTS (SELECT
1
FROM @ids AS [Extent2]
WHERE [Extent2].[Id] = [Extent1].[Id]
)
Run Code Online (Sandbox Code Playgroud)
这是完全参数化的。
这可以在 EF 即席查询中完成吗?
我知道可以使用EF 传递表值参数来直接查询(例如存储过程),使用 withSqlParameter和SqlDbType.StructuredaDataTable作为其值(请参阅/sf/answers/728679731/) …
我试图使用客户端访问ODBC驱动程序使用以下代码从.NET运行针对DB2数据库的参数化查询:
var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (@LAT)", db2Conn);
db2Cmd.Parameters.AddWithValue("@LAT", insertValue);
Console.Out.WriteLine(db2Cmd.ExecuteNonQuery());
Run Code Online (Sandbox Code Playgroud)
执行时,OdbcException抛出一个:
错误[42S22] [IBM] [iSeries Access ODBC驱动程序] [DB2 UDB] SQL0206 - 列@LAT不在指定的表中.
互联网似乎暗示客户端访问ODBC驱动程序支持参数化查询,但此错误似乎表明不是这样.提供的代码有什么问题吗?
使用参数化查询似乎将参数的长度设置为传入的值的长度.
做类似的事情:
var person = Connection.Query<People>("select * from People where Name = @name",
new { name = "Fred"});
Run Code Online (Sandbox Code Playgroud)
使参数为NVARCHAR(4),因此具有不同长度的下一个查询会在缓存的计划上出现错过并创建一个新的查询.
如何更改它以便它只使用我指定的长度.
我在python中删除sqlite3表时遇到问题.我正在使用标准sqlite3模块.
self.conn = sqlite3.connect(...)
sql = """ drop table ? """
self.conn.execute( sql, (u'table_name',) )
Run Code Online (Sandbox Code Playgroud)
给我 OperationalError: near "?": syntax error
当我sql改为:
sql = """ drop table table_name """
Run Code Online (Sandbox Code Playgroud)
它工作正常.
我试图将空值传递给TSQLDataset参数.查询具有以下形式:
Query_text:='MERGE INTO [Table]
USING (VALUES (:A,:B)) AS Source (Source_A, Source_B)
....
WHEN MATCHED THEN
UPDATE SET A = :A
WHEN NOT MATCHED THEN
INSERT(A, B) VALUES (:A,:B);
SQL_dataset.CommandType:=ctQuery;
SQL_dataset.CommandText:=Query_text;
SQL_dataset.ParamByName('A').AsString:='A';
SQL_dataset.ParamByName('B').AsString:={ COULD BE NULL, OR A STRING };
SQL_dataset.ExecSQL;
Run Code Online (Sandbox Code Playgroud)
参数B可以为空,但也是外键.如果用户在此字段中输入内容,则必须根据另一个表中的值验证B. 如果它是空白,那么我希望它被忽略.我正在传递'',但这显然会产生FK违规错误.
我试过了:
SQL_dataset.ParamByName('B').Value:=Null;
Run Code Online (Sandbox Code Playgroud)
..但后来我得到一个"dbexpress驱动程序不支持tdbxtypes.unknown数据类型"错误.
我也尝试过:
SQL_dataset.ParamByName('B').DataType:=ftVariant;
SQL_dataset.ParamByName('B').Value:=Null;
Run Code Online (Sandbox Code Playgroud)
..但后来得到"dbexpress驱动程序不支持tdbxtypes.variant数据类型"错误.
不知道我做错了什么,任何帮助将不胜感激.我目前正在根据字符串是否填充来绘制参数列表,这样做效果很好; 它只是有点笨重(在我的实际查询中),因为有很多参数需要验证.
我正在使用Delphi XE4和SQL Server 2012.
更新:
感谢所有的帮助,你的建议一直都是正确的,这是产生'dbexpress驱动'错误的其他因素.为了解决我的问题,我正在创建一个"灵活的"参数列表,这导致了异常:
Parameter_string:='';
If B<>'' then Parameter_string:='B = :B,'
Query_text:='MERGE ...'
'...'
'UPDATE SET A = :A, '+Parameter_string+' C = :C' ....
Run Code Online (Sandbox Code Playgroud)
...这个想法是,如果B为空,那么参数将不会在查询中"列出".
这不起作用,或者我的实现不起作用(不知道为什么,我显然在某个地方错过了一步).
无论如何,工作代码: …
在我的场景中,以下查询运行速度很快(在有 7000 万行的表上运行 0.5 秒):
select * from Purchases
where (purchase_id = 1700656396)
Run Code Online (Sandbox Code Playgroud)
而且,它甚至可以使用绑定变量快速运行:
var purchase_id number := 1700656396
select * from Purchases
where (purchase_id = :purchase_id)
Run Code Online (Sandbox Code Playgroud)
这些运行得很快,因为我在purchase_id列上有一个索引。(继续阅读...)
我需要创建一个允许对任意列进行“过滤”的查询。这意味着提供多个输入变量,并对每个变量进行过滤,除非它是null. 这起初工作正常。
例如,以下查询也运行得很快(0.5 秒):
select * from Purchases
where (1700656396 IS NULL OR purchase_id = 1700656396)
and (NULL IS NULL OR purchase_name = NULL)
and (NULL IS NULL OR purchase_price = NULL)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试通过绑定变量或存储过程参数化查询时,查询速度显着减慢(1.5 分钟),就好像它忽略了任何索引:
var purchase_id number := 1700656396
var purchase_name varchar2 := NULL
var purchase_price number := …Run Code Online (Sandbox Code Playgroud) oracle indexing parameterized-query bind-variables oracle11gr1
我已经对此进行了研究,虽然下面的问题很相似,但我已经尝试了所有这些,但似乎都没有解决我的问题.
Access数据库的UPDATE查询不能正常工作C#.NET
private void LoadDetails(int index)
{
try
{
connection.Open();
command = new OleDbCommand("SELECT * from tagsTbl WHERE ID=@1", connection);
command.Parameters.AddWithValue("@1", index);
reader = command.ExecuteReader();
while (reader.Read())
{
nameTextBox.Text = reader["leName"].ToString();
altTextBox.Text = reader["altName"].ToString();
unitTextBox.Text = reader["currUnit"].ToString();
tagTextBox.Text = reader["currTag"].ToString();
oldTextBox.Text = reader["oldTag"].ToString();
descTextBox.Text = reader["currDesc"].ToString();
}
connection.Close();
}
catch
{
connection.Close();
MessageBox.Show(errortxt);
Application.Exit();
}
}
private void testWin_Load(object sender, EventArgs e)
{
loadFileDialog.ShowDialog();
connection = new OleDbConnection(strConn);
if (!blnLoaded)
Application.Exit();
else
{
errortxt …Run Code Online (Sandbox Code Playgroud) 在Microsoft SQL Server中,要在查询窗口中测试类似的内容:
select * from Users where LastName = @lastname
Run Code Online (Sandbox Code Playgroud)
我可以在命令之前添加这个:
declare @lastname varchar(16)
set @lastname = 'Troy'
Run Code Online (Sandbox Code Playgroud)
但是在PostgreSQL中,我找不到类似的方法.似乎我唯一能做的就是直接用它的值替换参数名称.当ad-hoc查询变得复杂并且多次使用相同的参数时,它变得很难.有办法吗?
c# ×5
sql-server ×3
sql ×2
c#-4.0 ×1
db2 ×1
delphi ×1
delphi-xe4 ×1
indexing ×1
ms-access ×1
odbc ×1
oledb ×1
oracle ×1
oracle11gr1 ×1
postgresql ×1
python ×1
sql-drop ×1
sqlcommand ×1
sqlite ×1