我可以知道我的声明有什么问题吗?我收到一个语法错误。一直试图找出什么是错的。 :(动态创建的SQL插入语句出错
cmd.CommandText = "INSERT INTO LogIn(Username,Password) VALUES('" + AddUsernameTextBox.Text + "','" + AddPasswordTextBox.Text + "')";
我可以知道我的声明有什么问题吗?我收到一个语法错误。一直试图找出什么是错的。 :(动态创建的SQL插入语句出错
cmd.CommandText = "INSERT INTO LogIn(Username,Password) VALUES('" + AddUsernameTextBox.Text + "','" + AddPasswordTextBox.Text + "')";
cmd.CommandText = "INSERT INTO LogIn([Username],[Password]) VALUES('" + AddUsernameTextBox.Text + "','" + AddPasswordTextBox.Text + "')";
如果错误是由于保留关键字: - 用户名和密码造成的,则此代码将有所帮助。如果不是这样,请引用错误。
是ID列一个整数吗?如果不是你需要用值单引号了。 此外,尝试删除括号。
最有可能的,在IDTextBox.text值不是数字...
但像丹尼尔指出,这是对SQL注入很容易..
如果我输入会发生什么:
' ; DROP TABLE login
在EditUserNameTextBox字段中
检查是否有效。你在WHERE语句中缺少值单引号:
"UPDATE
LogIn
SET
Username = '" + EditUsernameTextBox.Text + "'
,Password = '" + EditPasswordTextBox.Text + "'
WHERE
(ID = '" + IDTextBox.Text + "')";
另外,要确保,丹尼尔·怀特所说,你采取任何SQL注入的照顾。
仍然收到语法错误:/可能是因为我的ID数据类型是自动编号? – pacheco 2011-02-13 22:13:55
你错过了一对单引号的,如果你的ID为非数字:
WHERE (ID ='" + IDTextBox.Text + "')";
做的EditUsernameTextBox.Text
或EditPasswordTextBox.Text
本身有引号值是多少?这将会使SQL发生混乱。
如果是这样,你需要逃避它们。或者不要使用已经指出的字符串连接...
并且您是否打印了该语句以查看所请求的外观?
最好的方法是使用参数:'@' 通过这个,你的代码将看起来更清晰和易于理解。并使您的应用程序更安全。
试试这个代码:
using (var con = new OleDbConnection(_constring))
{
con.Open();
using (
var cmd =
new OleDbCommand(
"UPDATE LogIn SET [email protected], [email protected] WHERE (ID = @Id)",
con))
{
try
{
cmd.Parameters.AddWithValue("@Username",EditUsernameTextBox.Text);
cmd.Parameters.AddWithValue("@Password",EditPasswordTextBox.Text);
cmd.Parameters.AddWithValue("@Id",IDTextBox.Text);
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw;
}
finally
{
con.Close();
}
}
商祺!
请保护单引号。另外,您可能需要Access SQL字符串中的结尾分号。
cmd.CommandText = “INSERT INTO登录(用户名,密码)VALUES( '” + AddUsernameTextBox.Text.Replace( “'”, “'”)+ “ ''” + AddPasswordTextBox.Text。替换(“'”,“''”)+“');”;
当然,使用参数化查询当然只有100%更好;从你的其他问题是这个C#/ Visual Studio通过OLE/Jet对MS Access?
command.CommandText = "INSERT INTO Login([Username],[Password]) VALUES(@Username, @Password)";
//Not sure how you create your commands in your project
//here I'm using the ProviderFactory to create instances of provider specific DbCommands.
var parameter = dbProviderFactory.CreateParameter();
parameter.DbType = System.Data.DbType.String;
parameter.ParameterName = "@Username";
parameter.Value = AddUsernameTextBox.Text;
command.Parameters.Add(parameter);
parameter = dbProviderFactory.CreateParameter();
parameter.DbType = System.Data.DbType.String;
parameter.ParameterName = "@Password";
parameter.Value = AddPasswordTextBox.Text;
command.Parameters.Add(parameter);
下面是一个使用ConnectionStringSettings和DbProviderFactory等,这是不会解决你的问题更完整的代码示例,但这是如果你使用ADO.NET的核心,你做的数据访问方式似乎在你的样本中做。
ConnectionStringSettings connectionStringSettings = ConfigurationManager.ConnectionStrings["SomeConnectionName"];
if (connectionStringSettings == null)
throw new Exception("Application config file does not contain a connectionStrings section with a connection called \"SomeConnectionName\"");
DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(connectionStringSettings.ProviderName);
using (var dbConnection = dbProviderFactory.CreateConnection())
{
dbConnection.ConnectionString = connectionStringSettings.ConnectionString;
dbConnection.Open();
using (var command = dbConnection.CreateCommand())
{
command.CommandText = "INSERT INTO Login([Username],[Password]) VALUES(@Username, @Password)";
var parameter = dbProviderFactory.CreateParameter();
parameter.DbType = System.Data.DbType.String;
parameter.ParameterName = "@Username";
parameter.Value = AddUsernameTextBox.Text;
command.Parameters.Add(parameter);
parameter = dbProviderFactory.CreateParameter();
parameter.DbType = System.Data.DbType.String;
parameter.ParameterName = "@Password";
parameter.Value = AddPasswordTextBox.Text;
command.Parameters.Add(parameter);
var dbTransaction = dbConnection.BeginTransaction();
try
{
command.ExecuteNonQuery();
dbTransaction.Commit();
}
catch (Exception)
{
dbTransaction.Rollback();
throw;
}
}
}
以上代码依赖的app.Config文件如下所示。当然,只有配置文件中的connectionStrings部分在这方面很重要
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="SomeConnectionName" providerName="System.Data.OleDb" connectionString="Your Provider Specific Connection String" />
</connectionStrings>
</configuration>
它会失败。访问将不会运行多个声明,但我qu :) :) – Fionnuala 2011-02-13 22:16:31
THanks Remou,我不知道。只是想举一个SQL注入有多危险的例子 – Sparky 2011-02-13 22:44:11
对于Jet/ACE,这不是很危险,因为没有DDL或DML语句可以通过WHERE子句注入。但是,可以更改行为的行数,这在使用SQL UPDATE的情况下可能很危险。有关Access的更多具体信息,请参阅http://stackoverflow.com/questions/512174/non-web-sql-injection/522382#522382。 – 2011-02-14 02:15:42