我发现在我的每个查询(需要自己的命令或写参数.clear())上编写一个using语句非常烦人,有时需要在using块之外声明变量.与没有处理物体的版本相比,它非常令人烦恼并且看起来更脏.
我需要处理它吗?如果我不这样做会发生什么?我知道在有对象时处理对象的好习惯.
SqlCommand.Parameters.AddWithValue()查询有什么变化?
我希望:
它取代了每一个'角色'',
如果参数值是一个字符串或必须转换为字符串的东西,它会围绕值',所以例如select * from A where B = @hello将给出select * from A where B = 'hello world'.
如果参数值像整数一样"安全",它将按原样插入查询中,不带引号,因此select * from A where B = @one会给出select * from A where B = 1.
还有其他我不知道的变化吗?
问题:我有一个带有文本值的表单,以及一个必须根据文本值的值返回字符串查询的函数.
解决方案:我使用参数创建了一个SQLCommand查询,然后我将SQLCommand.CommandText放到一个字符串中,然后将其返回(将要处理查询的业务逻辑)
主要问题:它是sql注入证明吗?
代码示例:
sQuery = "select * from xy where x like '%@txtNameParameter%'";
SqlCommand cmd = new SqlCommand(sQuery);
cmd.Parameters.Add("@txtNameParameter", SqlDbType.VarChar);
cmd.Parameters["@txtNameParameter"].Value = txtName.Text;
string query = cmd.CommandText;
return query;
Run Code Online (Sandbox Code Playgroud)
如果主要问题是好的子问题:我是否应该将参数放入radiobutton和dropdownmenu的值或者它们是否注入防护?
我从SQL Server 2008数据库返回标量值:
string reason = cmd.ExecuteScalar().ToString() ?? : "";
Run Code Online (Sandbox Code Playgroud)
我想确保if null返回,那reason = ""并且不是null.
我在这一行上收到错误:
错误3无效的表达式术语':'
怎么解决这个问题?
编辑:
谢谢你对冒号的更改,现在我在同一行上得到了这个异常:
string reason = cmd.ExecuteScalar().ToString() ?? "";
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)System.NullReferenceException occurred Message="Object reference not set to an instance of an object."
当我想基于删除整行时,我遇到了问题id_curse.这是我的代码,这是我得到的错误:
Oracle.DataAccess.dll中发生了未处理的"Oracle.DataAccess.Client.OracleException"类型异常.
附加信息:
外部组件引发的异常.
你能帮我解决这个问题吗?我认为SQL命令中的代码对此不利.
private void button3_Click(object sender, EventArgs e)
{
Oracle.DataAccess.Client.OracleConnection conn = new Oracle.DataAccess.Client.OracleConnection(provider);
Oracle.DataAccess.Client.OracleCommand cmd = new Oracle.DataAccess.Client.OracleCommand();
conn.Open();
cmd = new Oracle.DataAccess.Client.OracleCommand(" DELETE * from CURSE WHERE ID_CURSA = '" + textBox1.Text + "'", conn);
cmd.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud) 需要进行以下检查以检查空值.我有办法直接做到吗?
if(node.ID==0)
{
cmd.Parameters["@ID"].Value = DBNull.Value;
}
else
{
cmd.Parameters["@ID"].Value = node.ID;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法我们可以通过这个检查和一个设计,我们可以避免对每个值进行重复检查?(顺便说一句,它只是一个逻辑,0对于我的情况被解释为NULL,但我也要求像字符串这样的可空对象一样)
我试图将表名作为参数传递给我的查询,SqlCommand但它似乎没有工作.这是我的代码;
SqlConnection con = new SqlConnection( "server=.;user=sa;password=12345;database=employee" );
con.Open( );
SqlCommand cmd = new SqlCommand( "drop table @tbName" , con );
cmd.Parameters.AddWithValue( "@tbName" , "SampleTable" );
cmd.ExecuteNonQuery( );
con.Close( );
Run Code Online (Sandbox Code Playgroud) 这是我的存储过程:
CREATE Proc UpdateChecklist
(
@TemplateId As INT
) as
begin
select MF.CheckListDataId from TemplateModuleMap TM
inner join ModuleField MF
on TM.ModuleId = MF.ModuleId
where TM.TemplateId = @TemplateId and MF.CheckListDataId not in
(select cktm.CheckListDataId from ChecklistTemplateMap cktm
inner join ChecklistData ckd
on cktm.CheckListDataId = ckd.Id
where cktm.TemplateId = @TemplateId)
end
Run Code Online (Sandbox Code Playgroud)
所以我希望CheckListDataId这里有一个返回列表.我正在尝试使用Database.ExecuteSqlCommand()但尚未成功.我怎样才能返回CheckListDataId这里的清单?我需要修改我的存储过程吗?我是sql的新手.
有什么建议吗?这是一个ASP.NET MVC 5项目
我分析的代码中SqlCommand,看到它工作正常(见CompleteExecuteScalar方法).但我不确定我应该top 1在查询中使用.例如我有select name from Person和表Person包含很多记录.我应该修改qry select top 1 name from Person吗?或者我可以保持qry原样,它不会影响性能/内存等?我担心服务器可以在输出之前缓冲一些数据.
我正在尝试创建一个临时数据库以在 Xunit 中进行集成测试,但是当我尝试删除临时数据库时,出现错误:
无法删除数据库“TempDatabase_[numbers]”,因为它当前正在使用中。
简单地关闭和处理命令和连接似乎并不能切断它。
这是我失败的测试的精简版:
using System;
using System.Data.SqlClient;
using Xunit;
namespace Test
{
public class Test_Raw_Spec
{
[Fact]
public void PerformWorkInTemporaryDatabase()
{
string connectionStringTemplate = "Data Source=SQLEXPRESS;Initial Catalog={0};Integrated Security=SSPI;Connection Timeout=10";
int dbNum = (new Random()).Next() % 1000000;
int tblNum = (new Random()).Next() % 1000000;
string nameTempDb = $"TempDatabase_{dbNum}";
string nameTempTable = $"TempTable_{tblNum}";
var sqlConnection1 = new SqlConnection(string.Format(connectionStringTemplate, "master"));
var sqlCommand1 = new SqlCommand($"CREATE DATABASE {nameTempDb}", sqlConnection1);
sqlConnection1.Open();
sqlCommand1.ExecuteNonQuery();
sqlCommand1.Dispose();
sqlConnection1.Close();
sqlConnection1.Dispose();
var sqlConnection2 = new SqlConnection(string.Format(connectionStringTemplate, nameTempDb));
var …Run Code Online (Sandbox Code Playgroud) sqlcommand ×10
c# ×7
.net ×3
sql-server ×3
ado.net ×1
asp.net ×1
asp.net-mvc ×1
database ×1
dbnull ×1
escaping ×1
mysql ×1
oracle ×1
parameters ×1
performance ×1
sql ×1
t-sql ×1