标签: parameterized-query

Java中的参数化Oracle SQL查询?

我一直试图弄清楚为什么下面的代码没有在我的ResultSet中生成任何数据:

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL = ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo");
ResultSet rs = prepStmt.executeQuery();
Run Code Online (Sandbox Code Playgroud)

另一方面,以下运行正常:

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL = 'Waterloo' ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
ResultSet rs = prepStmt.executeQuery();
Run Code Online (Sandbox Code Playgroud)

SCHOOL的数据类型为CHAR(9字节).我也尝试过:而不是setString:

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL = ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
String school = "Waterloo";
Reader reader = new CharArrayReader(school.toCharArray());
prepStmt.setCharacterStream(1, reader, 9);
prepStmt.setString(1, "Waterloo");
ResultSet rs = prepStmt.executeQuery();
Run Code Online (Sandbox Code Playgroud)

我完全坚持接下来要调查的内容; …

java sql oracle jdbc parameterized-query

4
推荐指数
1
解决办法
2万
查看次数

参数分隔符

我有C#应用程序,我们一直在ADO.NET中编写代码.我一直在使用IDbCommandIDbConnection接口来创建跨数据库代码.

到目前为止,这一切都非常有效(跨Firebird,SQLite,SQL Server 2005和2008,Access 2007,Access 2010和Oracle 11g).

我遇到的问题是,我现在有一个我需要支持的Oracle 10g数据库.

然而,当我使用接口创建参数IDataParametercmd.CreateParamater()在10g上失败时,所有"正常"的东西,创建连接和命令都可以正常工作,因为查询中的参数语法(我正在使用参数化查询).

显然,开箱即用的Oracle 10g不支持使用该@标志.Oracle 11g,SQL Server以及提到的所有其他功能.

例如,以下查询将在10g中失败:

select * from Products where ProductId = @ProductId
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用冒号,使用上面提到的ado.net接口就可以成功,所以这个查询会成功:

select * from Products where ProductId = :ProductId
Run Code Online (Sandbox Code Playgroud)

不幸的是,冒号在大多数其他数据库实现中都不起作用.

或者是否有一个可以在Oracle 10g数据库中翻转的选项,该选项允许@使用:分隔符代替参数的分隔符.

我当前的解决方案不太理想,我有客户/客户端初始化属性ParameterDelimiter(我默认为@标志),并使用string.Format,来插入ParameterDelimiter.

有没有任何标准的方法可以做到这一点,我缺少,没有客户必须通过我的分隔符,或没有我的基础库了解数据库实现?(例如,包括ODP.NET和检查OracleConnection)

c# oracle ado.net odp.net parameterized-query

4
推荐指数
1
解决办法
975
查看次数

"必须使用ADO参数化查询声明变量@myvariable"错误

我试图使用ADO参数化查询.执行该Command对象会引发错误:

必须声明变量'@filename'

@filename使用CreateParameter/Append以下方式声明参数:

sql := 'INSERT INTO Sqm(Filename, data) VALUES(@filename, @data)';

command := CoCommand.Create;
command.Set_ActiveConnection(Connection.ConnectionObject);
command.Set_CommandText(sql);
command.Set_CommandType(adCmdText);
command.Parameters.Append(Command.CreateParameter('@filename', adLongVarWChar, adParamInput, -1, Filename));
command.Parameters.Append(Command.CreateParameter('@data', adLongVarWChar, adParamInput, -1, xml);

command.Execute({out}recordsAffected, EmptyParam, adCmdText or adExecuteNoRecords);
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

sql-server delphi ado parameterized-query

4
推荐指数
1
解决办法
4662
查看次数

我应该在C#中使用Connector/Net为MySql命名参数使用哪个前缀?

我正在使用Connector/Net 6.8.3进行C#项目并且已经使用它(或之前的版本)已有一段时间了.

在查看遗留代码时,我看到了与参数化查询相关的几个变体,并且一直试图确定差异是什么以及是否有最佳实践.

查询字符串:

  • 例1: cmd.CommandText = "UPDATE table SET thing = @value;";

  • 例2: cmd.CommandText = "UPDATE table SET thing = ?value;";

添加参数:

  • 例3: cmd.Parameters.AddWithValue("@value", user_value);

  • 例4: cmd.Parameters.AddWithValue("?value", user_value);

  • 例5: cmd.Parameters.AddWithValue("value", user_value);

所有这些变化似乎都有效.我无法在官方文档中找到解释前缀使用差异(@vs ?)的任何内容.但是,此devart.com页面显示以下内容:

  • 未命名的参数可以指定为"?" 符号.
  • 命名参数使用':'或'@'前缀声明,后跟参数名称.请注意,如果CommandText中的参数与"@"前缀一起使用,则命令集合中MySqlParameter对象的名称应包含"@"前缀.如果CommandText中的参数包含':'前缀,则应使用命令集合中的MySqlParameter对象的名称,而不使用任何前缀.

最后一点有一些语法问题,但所示的例子似乎表明,当使用' @'时,语句cmd.Parameters.AddWithValue("@value", user_value);应包括' @',但不包括' :'.

但是,在我正在审查的许多正常运行的方法中,查询@在命令文本中使用了' ' (示例1),但在语句中没有使用' ' (示例5).AddWithValue()

问题:

  • 添加参数时省略前缀的潜在后果是什么?(例5)

  • 使用' ?'前缀时没有理由添加参数名称,因为它是用于未命名的参数吗?(例2)

.net mysql parameterized-query

4
推荐指数
1
解决办法
1128
查看次数

如何从另一个表插入 PostgreSQL 中的值?

我有一个引用其他表的表:

CREATE TABLE scratch
(
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  rep_id INT NOT NULL REFERENCES reps,
  term_id INT REFERENCES terms
);
CREATE TABLE reps (
  id    SERIAL PRIMARY KEY,
  rep   TEXT NOT NULL UNIQUE
);
CREATE TABLE terms (
  id    SERIAL PRIMARY KEY,
  terms TEXT NOT NULL UNIQUE
);
Run Code Online (Sandbox Code Playgroud)

我希望在给定namerepterms值的情况下添加一个新记录,即我既没有相应的rep_id也没有term_id

现在我唯一的想法是:

insert into scratch (name, rep_id, term_id)
             values ('aaa', (select id from reps where rep='Dracula' limit 1), …
Run Code Online (Sandbox Code Playgroud)

postgresql subquery parameterized-query

3
推荐指数
1
解决办法
2万
查看次数

sqlite3 中使用问号的参数化查询

我正在将 sqlite3 模块与 Python 一起使用,并且到目前为止已经有了这段代码。在数据库中,我存储了每日天气状况,现在我需要我的代码用更新的数据替换一些行。该代码应该寻找datetime值等于的行new_data[0]

我参数化查询的方式是错误的,但无法找出正确和最优雅的方法!

new_data = ['12 Mar 2014', 'sunny', 20, 12]

conn = sqlite3.connect(database_file)
c = conn.cursor()
c.execute("UPDATE weather SET datetime = ?, condition = ?, high = ?, low = ? WHERE datetime = %s" new_data, %new_data[0])
Run Code Online (Sandbox Code Playgroud)

python sql sqlite parameterized-query

3
推荐指数
1
解决办法
7746
查看次数

数据读取器与指定的不兼容。在数据读取器中没有具有相同名称的对应列

我不断收到以下异常。例外使我感到困惑,因为我没有选择UserID

我尝试将选择更改为,SELECT *但这只会导致a result.Count为0,无论数据是否存在。

我在数据库中有一个虚拟记录,称为bob tob。

我注意到,如果将鼠标悬停在的用户部分上db.Users.SqlQuery

里面的文字是

{SELECT 
[Extent1].[userID] AS [userID], 
[Extent1].[userFirstName] AS [userFirstName], 
[Extent1].[userLastName] AS [userLastName], 
[Extent1].[userName] AS [userName], 
[Extent1].[userEmail] AS [userEmail], 
[Extent1].[userPassword] AS [userPassword], 
[Extent1].[userStatus] AS [userStatus], 
[Extent1].[userEmailVerificationStatus] AS [userEmailVerificationStatus], 
[Extent1].[userActivationCode] AS [userActivationCode]
FROM [dbo].[Users] AS [Extent1]}
Run Code Online (Sandbox Code Playgroud)

我猜它正在尝试选择所有User类项,无论如何?如果是这样,那我该如何制止呢?我想念什么?

这是例外:

数据读取器与指定的“ UserRegistrationPasswordsModel.User”不兼容。类型“ userID”的成员在数据读取器中没有具有相同名称的对应列。

下面是调用的代码EmailExists。我ToString()错误地希望这可能是问题所在。

#region EmailExist
// Email already exists?
if (Utilities.EmailExists(user.userEmail.ToString()))
{
    // A pretty awesome way to make a custom exception
    ModelState.AddModelError("EmailExist", "Email already exists"); …
Run Code Online (Sandbox Code Playgroud)

c# asp.net asp.net-mvc parameterized-query

3
推荐指数
1
解决办法
5310
查看次数

方法优化 - C#

我开发了一个方法,允许我通过参数传入表(字符串),列数组(字符串)和值数组(对象),然后我使用这些参数创建参数化查询.虽然它工作得很好,代码的长度以及多个for循环都会产生代码气味,特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的更好的方式完成.

public static int Insert(string source, string[] column, object[] values)
{
    int rowsAffected = 0;
    try
    {
        using (SQLiteConnection conn = new SQLiteConnection(connectionString))
        {
            StringBuilder query = new StringBuilder();
            query.Append(" INSERT INTO ");
            query.Append(source);
            query.Append("(");

            for (int i = 0; i < column.Length; i++)
            {
                query.Append(column[i]);

                if (i < values.Length - 1)
                {
                    query.Append(",");
                }
            }

            query.Append(")");
            query.Append(" VALUES ");
            query.Append("(");

            for (int i = 0; i < values.Length; i++)
            {
                query.Append("@" + values[i].ToString());

                if (i < values.Length - 1) …
Run Code Online (Sandbox Code Playgroud)

c# system.data.sqlite parameterized-query

2
推荐指数
1
解决办法
308
查看次数

就ADO而言,nvarchar(max)有多大?

我正在尝试对ADO使用参数化查询:

INSERT INTO Foo(名称,值)VALUES(@ name,@ value)

在SQL Server中,Name列是一种varchar类型.这个Value专栏是一个nvarchar(max).

什么尺寸做我创建参数时,我不知道,还是要指定,大小的时候通过?

procedure SaveTheThing(Connection: TADOConnection);
var
   sql: WideString;
   cmd: _Command;
begin
   sql := 'INSERT INTO Foo (Name, Value) VALUES(@name, @value)';

   cmd := CoCommand.Create;
   cmd.Set_ActiveConnection(Connection.ConnectionObject);
   cmd.Set_CommandType(adCmdText);
   cmd.Set_CommandText(sql);

   //and now add the parameters
   cmd.Parameters.Append(
         cmd.CreateParameter('@name', adVarChar, adParamInput, -1, filename)
   );
   cmd.Parameters.Append(
         cmd.CreateParameter('@value', adVarWChar, adParamInput, -1, GetXmlToWideString)
   );

   cmd.Execute({out}recordsAffected, EmptyParam, adCmdSomeThatDoesntCauseAnExcetpion or adExecuteNoRecords);
end;
Run Code Online (Sandbox Code Playgroud)

简单的替代方案是:

sql := 'INSERT INTO Foo (Name, Value)'#13#10+ …
Run Code Online (Sandbox Code Playgroud)

delphi ado parameterized-query

2
推荐指数
1
解决办法
2750
查看次数

使用 SqlAlchemy 执行原始查询(在 SQL-Server 数据库和 Pymssql 上)时,传递的参数无法识别并引发 SQL 错误

我正在尝试使用 SqlAlchemy(以及 Pymssql 作为提供程序)在 SQL-Server 数据库上执行简单的原始 SQL 查询。

这是我的第一次尝试(使用execute连接方法并以 **kwargs 方式传递参数):

provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query = text(q)
result = provider.connect().execute(query, source ='mysource')
Run Code Online (Sandbox Code Playgroud)

我以教程中显示的任何方式传递了参数(作为 kwargs 传递并作为 dict 传递),但是它们都不起作用,并且当execute调用方法时抛出异常,表示'Must declare the scalar variable' @source好像没有参数传递给execute方法,似乎是 ORM (或者可能是数据提供程序(在本例中为 pymssql))无法识别传递给的参数execute方法的参数,并且仅将查询(不带参数)传递给数据库引擎(这会导致异常)。

我猜想 MSSQL-Server 提供程序 (Pymssql) 可能存在一些问题,因为 SQL-Server 不是 SqlAlchemy 和 Python 家族中的一等公民,但没有直接线索可能导致此问题。

正如我上面所说,我也尝试了其他方法

这是我的第二次尝试(使用execute连接方法并将参数作为字典传递):

provider = DataProvider().engine
q = "select url from Crawler.CrawlSource where source=@source"
query …
Run Code Online (Sandbox Code Playgroud)

python sql-server sqlalchemy parameterized-query pymssql

2
推荐指数
1
解决办法
2015
查看次数