在查询1和2中,文本框中的文本都插入到数据库中.这里参数化查询的意义是什么?
1.> -------------
SqlCommand cmd = new SqlCommand("INSERT INTO dbo.Cars " +"VALUES(@TagNbr);" , conn);
cmd.Parameters.Add("@TagNbr", SqlDbType.Int);
cmd.Parameters["@TagNbr"].Value = txtTagNumber.Text;
Run Code Online (Sandbox Code Playgroud)
2.> --------------
int tagnumber = txtTagNumber.Text.ToInt16(); /* EDITED */
INSERT into Cars values(tagnumber.Text); /* then is it the same? */
Run Code Online (Sandbox Code Playgroud)
此外,在这里我将使用正则表达式验证来停止插入非法字符.
据我所知,预备语句(主要)是一个数据库功能,允许您将参数与使用此类参数的代码分开.例:
PREPARE fooplan (int, text, bool, numeric) AS
INSERT INTO foo VALUES($1, $2, $3, $4);
EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);
Run Code Online (Sandbox Code Playgroud)
参数化查询替代手动字符串插值,因此不是这样做
cursor.execute("SELECT FROM tablename WHERE fieldname = %s" % value)
Run Code Online (Sandbox Code Playgroud)
我们可以做的
cursor.execute("SELECT FROM tablename WHERE fieldname = %s", [value])
Run Code Online (Sandbox Code Playgroud)
现在,似乎准备好的语句大部分都用在数据库语言中,参数化查询主要用于连接数据库的编程语言,尽管我已经看到了这个规则的例外.
问题在于询问预准备语句和参数化查询之间的区别会带来很多混乱.他们的目的无疑是相同的,但他们的方法似乎是截然不同的.然而,有消息表明两者都是相同的.MySQLdb和Psycopg2似乎支持参数化查询,但不支持预处理语句(例如,这里是MySQLdb和postgres驱动程序的TODO列表或sqlalchemy 组中的这个答案).实际上,有一个实现psycopg2游标的要点,支持准备好的语句和关于它的最小解释.还有一个建议是在psycopg2中继承游标对象以手动提供准备好的语句.
我想得到以下问题的权威答案:
预准备语句和参数化查询之间是否存在有意义的区别?这在实践中是否重要?如果使用参数化查询,是否需要担心预处理语句?
如果存在差异,Python生态系统中预准备语句的当前状态是什么?哪些数据库适配器支持预处理语
python database sql-injection prepared-statement parameterized-query
我有一个datetime数据类型:dttm
数据库字段类型也是 datatime
现在我这样做:
if (dttm.HasValue)
{
cmd.Parameters.AddWithValue("@dtb", dttm);
}
else
{
// It should insert null value into database
// through cmd.Parameters.AddWithValue("@dtb", _____)
}
Run Code Online (Sandbox Code Playgroud)
如何才能做到这一点.
我有一个针对SQL2005的参数化SQL查询,它是在代码中动态创建的,所以我使用ADO.NET SqlParameter类来添加sql参数SqlCommand.
在前面提到的SQL中,我从具有默认值的表值函数中进行选择.我希望我的动态sql有时为这些默认参数指定一个值,有时我想指定应该使用SQL DEFAULT- 如表值函数中定义的那样.
为了保持代码清洁,我不想动态添加SQL DEFAULT关键字并在使用非默认值时对其进行参数化,我只想将其设置DEFAULT为my的值SQLParameter.
我可以吗?在这种情况下,最佳做法是什么?
我正在尝试切换一些硬编码查询以使用参数化输入,但我遇到了一个问题:如何格式化参数化批量插入的输入?
目前,代码如下所示:
$data_insert = "INSERT INTO my_table (field1, field2, field3) ";
$multiple_inserts = false;
while ($my_condition)
{
if ($multiple_inserts)
{
$data_insert .= " UNION ALL ";
}
$data_insert .= " SELECT myvalue1, myvalue2, myvalue3 ";
}
$recordset = sqlsrv_query($my_connection, $data_insert);
Run Code Online (Sandbox Code Playgroud)
一个潜在的解决方案(从如何将数组插入到PHP和PDO的单个MySQL Prepared语句中修改)似乎是:
$sql = 'INSERT INTO my_table (field1, field2, field3) VALUES ';
$parameters = array();
$data = array();
while ($my_condition)
{
$parameters[] = '(?, ?, ?)';
$data[] = value1;
$data[] = value2;
$data[] = value3;
}
if (!empty($parameters)) …Run Code Online (Sandbox Code Playgroud) 请仔细阅读问题.这通常不是愚蠢的"我的代码不起作用!!!" 题.
当我使用预期的错误运行此代码时
try {
$sth = $dbh->prepare("SELECT id FROM users WHERE name INN(?,?) ");
$sth->execute(array("I'm","d'Artagnan"));
} catch (PDOException $e) {
echo $e->getMessage();
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息
您的SQL语法中有错误...在第1行'INN('我'','d \'Artagnan')'附近
但我多年来一直认为查询和数据是分开发送给服务器的,而且绝不干涉.因此我有一些问题(虽然我怀疑有人得到答案......)
更新
mysqli 是按预期做的:它会抛出一个错误说 near 'INN(?,?)'
我对Delphi很新,并收到了以下代码(省略了一些不相关的部分),我正试图了解它的作用:
object SelectCosts: TIBQuery
SQL.Strings = (
'SELECT * FROM costs '
'WHERE code = :code')
ParamData = <
item
DataType = ftUnknown
Name = 'code'
ParamType = ptUnknown
end>
end
Run Code Online (Sandbox Code Playgroud)
在另一个文件中,使用该查询,但添加了未在查询中定义的参数.
DM_HRV.SelectCosts.ParamByName('part').Value := 1;
Run Code Online (Sandbox Code Playgroud)
此参数是否会'part'改变所做的选择?换句话说:SQL查询是否自动更改为以下内容?
'SELECT * FROM costs '
'WHERE code = :code'
'AND part = :part'
Run Code Online (Sandbox Code Playgroud) 我正在尝试开发一个可以在外部数据源中找到相应记录的电子表格.所以,假设我的列A带有一个标识值列表.我想开发B列,它可能会显示表中具有该值的行数.就像是:
A B
758348 "=SELECT COUNT(*) FROM MYTABLE WHERE IDVALUE=$A$1"
173483 "=SELECT COUNT(*) FROM MYTABLE WHERE IDVALUE=$A$2"
Run Code Online (Sandbox Code Playgroud)
... 等等.所以,我以为我会使用参数化查询(其中IDVALUE =?),但这会提示我输入参数值,而不是使用左边单元格中的值.有什么方法可以做到这一点吗?