我正在用C#编写一个小程序,它使用SQL在运行时根据用户的输入将值存储到数据库中.
唯一的问题是我无法弄清楚正确的Sql语法将变量传递到我的数据库.
private void button1_Click(object sender, EventArgs e)
{
int num = 2;
using (SqlCeConnection c = new SqlCeConnection(
Properties.Settings.Default.rentalDataConnectionString))
{
c.Open();
string insertString = @"insert into Buildings(name, street, city, state, zip, numUnits) values('name', 'street', 'city', 'state', @num, 332323)";
SqlCeCommand cmd = new SqlCeCommand(insertString, c);
cmd.ExecuteNonQuery();
c.Close();
}
this.DialogResult = DialogResult.OK;
}
Run Code Online (Sandbox Code Playgroud)
在这段代码中我使用了所有静态值,除了我试图传递给数据库的num变量.
在运行时我收到此错误:
A parameter is missing. [ Parameter ordinal = 1 ]
Run Code Online (Sandbox Code Playgroud)
谢谢
该SqlCommand.Parameters.AddWithValue方法注射安全吗?
它接受Object有效载荷,所以它如何防止注入?
.net parameters sql-injection sqlcommand sql-parametrized-query
我正在处理一个Web表单,它接收一个包含带SQL参数的SQL查询语句的字符串.它为每个参数生成一个ASP.NET控件,然后将每个控件的值分配给将用于SqlCommand填充a 的SQL查询字符串的参数DataAdapter.
我有一些问题来管理可选参数.
防爆.
1)将字符串传递给页面:
string query = "SELECT * FROM Table WHERE Field1=@P1 AND field2=@P2";
Run Code Online (Sandbox Code Playgroud)
2)为每个参数生成Web控件
TextBox P1 = new TextBox();
P1.ID = "P1";
...
TextBox P2 = new TextBox();
P2.ID = "P2";
...
PanelParameters.Controls.Add(P1);
PanelParameters.Controls.Add(P1);
Run Code Online (Sandbox Code Playgroud)
3)点击时将每个参数的值传递给SqlCommandas参数:
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@P1", P1.Text);
cmd.Parameters.AddWithValue("@P2", P2.Text);
Run Code Online (Sandbox Code Playgroud)
4)就在这里,没关系!
但如果参数是可选的,我该如何管理呢?
如果P2是可选的,则用户无法编译它,在这种情况下我不想设置P2 = NULL(设置参数的值DbNull.Value),但我希望P2将从查询SQL中消失.
你能帮助我吗?
*更新* 我无法编辑我收到的查询,因为它包含非常复杂的SQL语句.
我有问题使用为什么我不能在同一代码中多次使用相同的SQLCommand实例?
我在这里尝试了代码并且它对gridview运行良好但是当我通过使用cmd.CommandText()方法更改查询时它会一直说:
已经有一个与此命令关联的打开DataReader,必须先关闭它.
这是代码:
string cs = ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString;
SqlConnection con = new SqlConnection(cs);
try
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
con.Open();
cmd.CommandText = "Select top 10 FirstName, LastName, Address, City, State from Customers";
GridView1.DataSource = cmd.ExecuteReader();
GridView1.DataBind();
cmd.CommandText = "SELECT TOP 10 COUNT(CreditLimit) FROM Customers";
int total = (int)cmd.ExecuteScalar();
TotalCreditLble.Text = "The total Credit :" + total.ToString();
}
catch(Exception exp)
{
Response.Write(exp.Message);
}
finally
{
con.Close();
}
Run Code Online (Sandbox Code Playgroud) 在我用C#编写的应用程序中,我正在编写一个SQL查询.以下是查询
SELECT [Resource No_] where [Resource No_] In (@resources)
Run Code Online (Sandbox Code Playgroud)
@resources 是具有一个或多个一个字符串的用户输入参数.
我的查询失败而没有显示错误
根据我的说法,查询失败,因为@resources正在传递参数跟随
"'123,'124','125'"
Run Code Online (Sandbox Code Playgroud)
(在开头和结尾有两个引号,这是我的查询失败).
[Resource No_]是NVARCHAR数据库中的类型.
谷歌搜索后,我已经找到了一些关于这个主题的帮助,但所有这些都适用[Resource No_] 于类型Integer
我想我几乎看到了与这个问题相关的每一页,最可能的答案是 检查SQL表是否存在 但是并不是真的理解它.这就是我得到的:
private void select_btn_Click(object sender, EventArgs e)
{
string theDate = dateTimePicker1.Value.ToString("dd-MM-yyyy");
SqlConnection SC = new SqlConnection("Data Source=ruudpc;Initial Catalog=leden;Integrated Security=True");
SqlCommand DateCheck = new SqlCommand("SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '" + theDate + "'");
}
Run Code Online (Sandbox Code Playgroud)
现在我想要DateCheck.ExecuteScalar()的返回值; 这可以告诉我它是否存在,可能很简单.
编辑
无论是sql注入部分,对于某些人来说这个问题是有帮助的,通常不好的做法是动态创建表,我建议你重新考虑你的ERD.只是说.
如何将SqlParameter的值设置为相当于 SQL INSERT 语句的DEFAULT关键字?
MSDN 文档说“使用 null 或不设置 Value 以使用参数的默认值”。但是,执行任一操作都会导致 SqlException 抱怨未提供预期参数。我也尝试将参数设置为 DBNull.Value 但这导致抱怨不允许空值。
这样做的正确方法是什么?
-- table schema
CREATE TABLE SomeTable (Field INT NOT NULL DEFAULT(1));
using (var command = this.conn.CreateCommand())
{
command.CommandText = "INSERT [dbo].[SomeTable] ([Field]) VALUES (@p0);";
var param = new SqlParameter();
param.ParameterName = "@p0";
//param.Value = ??;
command.Parameters.Add(param);
command.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud) 代码没有抛出任何错误,只是没有执行语句
Private Sub Update_Program(item As Programme)
'Set Command
SchoolTypes.Connexion.Open()
item.Command = New SqlClient.SqlCommand("UPDATE T_Programme Set pro_nom='@nom' , pro_nbr_unites=@nom , pro_nbr_heures=@unit WHERE pro_no ='@no'", SchoolTypes.Connexion)
''Add Parameter
item.Command.Parameters.Add("@no", SqlDbType.VarChar, 6)
item.Command.Parameters.Add("@nom", SqlDbType.VarChar, 50)
item.Command.Parameters.Add("@unit", SqlDbType.Float)
item.Command.Parameters.Add("@heures", SqlDbType.Int)
''''Set Values
item.Command.Parameters("@no").Value = item.Pro_No
item.Command.Parameters("@nom").Value = item.Pro_Nom
item.Command.Parameters("@unit").Value = item.Pro_Nbr_Unit
item.Command.Parameters("@heures").Value = item.Pro_Nbr_Heure
Try
If item.Command.ExecuteNonQuery() > 0 Then
MsgBox("Modifier avec Succes!")
End If
SchoolTypes.Connexion.Close()
Catch ex As Exception
err.ShowDetails(System.Reflection.MethodBase.GetCurrentMethod(), ex)
End Try
End Sub
Run Code Online (Sandbox Code Playgroud)
我已经测试了我的命令,它适用于 sql 但不适用于程序......
这是我的数据库数据库的粘贴
以下是用于查询数据库以获取用户ID列表的C#代码:
int id;
con = new SqlConnection(Properties.Settings.Default.ConnectionStr);
con.Open();
id = 180;
SqlCommand command = new SqlCommand("Select userid from UserProfile where grpid=@id", con);
command.Parameters.AddWithValue("@id", id);
using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
Console.WriteLine(String.Format("{0}", reader["userid"]));
}
}
con.Close();
Run Code Online (Sandbox Code Playgroud)
产量:5629
实际上,名单Users有grpid = 180是5629,5684,5694.
如何在列表或数组中读取结果?
这是一个基本的SQL日期时间问题,但我不想弄乱我的数据库!
例如,在MySQL数据库中,如果我想在我的一个表中的单个列中替换日期X和日期Y之间的所有日期时间值 - 那么SQL命令是做什么的?示例:我想将本月1月的所有日期时间值替换为3月份的未来日期/时间.
由于其他StackOverflow问题,我知道如何选择一系列日期时间 - 例如:
select * from table where DatetimeField between '22/02/2009 09:00:00.000' and '23/05/2009 10:30:00.000'
Run Code Online (Sandbox Code Playgroud)
但是如何添加replace()函数呢?
在此先感谢您的帮助 - 我已经进行了数据库备份以防万一!
sqlcommand ×10
c# ×6
sql ×5
.net ×2
sql-server ×2
asp.net ×1
datetime ×1
mysql ×1
parameters ×1
replace ×1
sqlparameter ×1
vb.net ×1