我一直试图弄清楚为什么下面的代码没有在我的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)
我完全坚持接下来要调查的内容; …
我有C#应用程序,我们一直在ADO.NET中编写代码.我一直在使用IDbCommand和IDbConnection接口来创建跨数据库代码.
到目前为止,这一切都非常有效(跨Firebird,SQLite,SQL Server 2005和2008,Access 2007,Access 2010和Oracle 11g).
我遇到的问题是,我现在有一个我需要支持的Oracle 10g数据库.
然而,当我使用接口创建参数IDataParameter并cmd.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)
我试图使用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)
我究竟做错了什么?
我正在使用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页面显示以下内容:
最后一点有一些语法问题,但所示的例子似乎表明,当使用' @'时,语句cmd.Parameters.AddWithValue("@value", user_value);应包括' @',但不包括' :'.
但是,在我正在审查的许多正常运行的方法中,查询@在命令文本中使用了' ' (示例1),但在语句中没有使用' ' (示例5).AddWithValue()
添加参数时省略前缀的潜在后果是什么?(例5)
使用' ?'前缀时没有理由添加参数名称,因为它是用于未命名的参数吗?(例2)
我有一个引用其他表的表:
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)
我希望在给定name,rep和terms值的情况下添加一个新记录,即我既没有相应的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) 我正在将 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) 我不断收到以下异常。例外使我感到困惑,因为我没有选择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) 我开发了一个方法,允许我通过参数传入表(字符串),列数组(字符串)和值数组(对象),然后我使用这些参数创建参数化查询.虽然它工作得很好,代码的长度以及多个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) 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) 我正在尝试使用 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) c# ×3
ado ×2
delphi ×2
oracle ×2
python ×2
sql ×2
sql-server ×2
.net ×1
ado.net ×1
asp.net ×1
asp.net-mvc ×1
java ×1
jdbc ×1
mysql ×1
odp.net ×1
postgresql ×1
pymssql ×1
sqlalchemy ×1
sqlite ×1
subquery ×1