SQL连接命令不会更改数据

时间:2013-04-04 08:57:00

标签: c# visual-studio-2012 sqlconnection

如何在这些说明后知道数据库中的表是否受到影响?我尝试在控制台中显示查询结果,但它没有显示任何内容。

static void Main(string[] args)
{
    DateTime date = new DateTime(2013, 3, 4);

    try 
    {
        SqlConnection connection = new SqlConnection("Data Source=ExchangeRatesByDate/TestApplication/Rates_DB.sdf");
        Console.WriteLine("Connection is created");

        connection.Open();
        Console.WriteLine("Connection is opened");

        SqlCommand insertCommand = connection.CreateCommand();
        insertCommand.CommandText = "INSERT INTO Rates_Table(ISO, Amount, Rate, Date) VALUES (USD, 1, 417.5, date)";
        insertCommand.ExecuteNonQuery();

        SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Rates_Table", connection);
        DataTable data = new DataTable();
        adapter.Fill(data);

        Console.WriteLine(adapter);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
    }
}

3 个答案:

答案 0 :(得分:0)

ExecuteNonQuery()返回受影响记录数的整数。

int _affected = insertCommand.ExecuteNonQuery();

后续问题

INSERT INTO Rates_Table(ISO, Amount, Rate, Date) VALUES (USD, 1, 417.5, date)

在上面的语句中,值USDdate是实数值,因为如果是这样,它肯定会抛出异常。它应该用这样的单引号换行:

INSERT INTO Rates_Table(ISO, Amount, Rate, Date) VALUES ('USD', 1, 417.5, '')

因为它们是字符串文字。但这不是在INSERT语句中插入具有实际值的数据的正确方法。应对参数化值进行参数化以避免sql injection

string sqlStatement = "INSERT INTO Rates_Table(ISO, Amount, Rate, Date) VALUES (@iso, @Amount, @rate, @date)";
using (SqlConnection conn = new SqlConnection(connStr))
{
    using(SqlCommand comm = new SqlCommand())
    {
        comm.Connection = conn;
        comm.CommandText = sqlStatement;
        comm.CommandType = CommandType.Text;

        comm.Parameters.AddWithValue("@iso", '-- value --');
        comm.Parameters.AddWithValue("@Amount", '-- value --');
        comm.Parameters.AddWithValue("@rate", '-- value --');
        comm.Parameters.AddWithValue("@date", '-- value --');

        try
        {
            conn.Open();
            int _affected = comm.ExecuteNonQuery();
        }
        catch(SqlException e)
        {
            // do something with the exception
            // do not hide it
            // e.Message.ToString()
        }
    }
}

正确编码

  • 使用using语句进行propr对象处理
  • 使用try-catch块来正确处理对象

答案 1 :(得分:0)

ExecuteNonQuery()返回一个显示受影响行数的整数。 ExecuteNonQuery

  

您可以使用ExecuteNonQuery执行目录操作(for   例如,查询数据库的结构或创建数据库   诸如表之类的对象,或者在没有的情况下更改数据库中的数据   通过执行UPDATE,INSERT或DELETE语句来使用DataSet。   虽然ExecuteNonQuery不返回任何行,但任何输出参数或   映射到参数的返回值将填充数据。

     

对于UPDATE,INSERT和DELETE语句,返回值为   受命令影响的行数。当a上存在触发器时   正在插入或更新的表,返回值包括数字   受插入或更新操作影响的行数和数字   受触发器或触发器影响的行数。对于所有其他类型的   语句,返回值为-1。如果发生回滚,则返回   值也是-1。

试试这个

int updatedRows = insertCommand.ExecuteNonQuery();

if(updatedRows>0)
{
 //do something
}

答案 2 :(得分:0)

我认为你正在向数据表显示SqlDataAdapter对象show,并且还使用像'USD'这样的插入字符串的参数