OleDb 命令失败
OleDbCommand Failed
我使用这段代码向数据库添加一条记录Clients.accdb
但是当我尝试执行该命令时它失败了(如果我使用 Microsoft Access 打开数据库,该命令有效,所以它不是错误的命令)。
我的添加函数如下:
public static void AddClient(string ipAddress, string macAddrress, string machineName)
{
string command = "INSERT INTO tbl_Clients (ipAddress, macAddress, machineName) VALUES ('" + ipAddress +"', '" + macAddrress + "', '" + machineName + "')";
OleDbConnection connection= new OleDbConnection(ConnectionStringStatic());
OleDbCommand cmd = new OleDbCommand(command, connection);
try
{
connection.Open();
OleDbDataReader dr = cmd.ExecuteReader(); // here it move to the catch..why ??
while (dr.Read())
{
}
dr.Close();
}
catch (OleDbException ex)
{
}
catch (Exception ex)
{
}
finally
{
if (connection.State != ConnectionState.Closed)
{
connection.Close();
}
}
}
我使用了几乎相同的方法(只有连接字符串和数据库不同)并且它起作用了。
为什么它在这里不起作用?
您需要使用 ExecuteNonQuery
执行查询。 ExecuteReader
returns 数据对 INSERT
语句没有意义。
但更重要的是,您应该始终使用 parameterized queries. This kind of string concatenations are open for SQL Injection 攻击。
还可以使用 using
statement 自动处理您的连接和命令,而不是手动调用 Close
方法。
using(var connection = new OleDbConnection(ConnectionStringStatic()))
using(var cmd = connection.CreateCommand())
{
cmd.CommandText = @"INSERT INTO tbl_Clients (ipAddress, macAddress, machineName)
VALUES (?, ?, ?)";
cmd.Parameters.Add("@ip", ipAddress);
cmd.Parameters.Add("@mac", macAddrress);
cmd.Parameters.Add("@name", machineName);
connection.Open();
cmd.ExecuteNonQuery();
} // <-- Both connection and command are disposed here
我使用这段代码向数据库添加一条记录Clients.accdb 但是当我尝试执行该命令时它失败了(如果我使用 Microsoft Access 打开数据库,该命令有效,所以它不是错误的命令)。
我的添加函数如下:
public static void AddClient(string ipAddress, string macAddrress, string machineName)
{
string command = "INSERT INTO tbl_Clients (ipAddress, macAddress, machineName) VALUES ('" + ipAddress +"', '" + macAddrress + "', '" + machineName + "')";
OleDbConnection connection= new OleDbConnection(ConnectionStringStatic());
OleDbCommand cmd = new OleDbCommand(command, connection);
try
{
connection.Open();
OleDbDataReader dr = cmd.ExecuteReader(); // here it move to the catch..why ??
while (dr.Read())
{
}
dr.Close();
}
catch (OleDbException ex)
{
}
catch (Exception ex)
{
}
finally
{
if (connection.State != ConnectionState.Closed)
{
connection.Close();
}
}
}
我使用了几乎相同的方法(只有连接字符串和数据库不同)并且它起作用了。
为什么它在这里不起作用?
您需要使用 ExecuteNonQuery
执行查询。 ExecuteReader
returns 数据对 INSERT
语句没有意义。
但更重要的是,您应该始终使用 parameterized queries. This kind of string concatenations are open for SQL Injection 攻击。
还可以使用 using
statement 自动处理您的连接和命令,而不是手动调用 Close
方法。
using(var connection = new OleDbConnection(ConnectionStringStatic()))
using(var cmd = connection.CreateCommand())
{
cmd.CommandText = @"INSERT INTO tbl_Clients (ipAddress, macAddress, machineName)
VALUES (?, ?, ?)";
cmd.Parameters.Add("@ip", ipAddress);
cmd.Parameters.Add("@mac", macAddrress);
cmd.Parameters.Add("@name", machineName);
connection.Open();
cmd.ExecuteNonQuery();
} // <-- Both connection and command are disposed here