1

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

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());
    }
}
4

3 回答 3

0

我想你正在向数据表显示 SqlDataAdapter 对象,并且还使用参数来插入字符串,如“USD”

于 2013-04-04T09:04:53.470 回答
0

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

int _affected = insertCommand.ExecuteNonQuery();

后续问题

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

在上面的语句中,是值USD并且date是真实值,因为如果是这样,它很确定它会抛出异常。它应该用这样的单引号括起来:

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 对象处理的use语句
  • 使用try-catch块来正确处理对象
于 2013-04-04T08:59:59.510 回答
0

ExecuteNonQuery()返回一个整数,显示受影响的行数。 执行非查询

您可以使用 ExecuteNonQuery 来执行目录操作(例如,查询数据库的结构或创建数据库对象,如表),或者通过执行 UPDATE、INSERT 或 DELETE 语句来更改数据库中的数据而不使用 DataSet。尽管 ExecuteNonQuery 不返回任何行,但任何输出参数或映射到参数的返回值都会填充数据。

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

试试这样

int updatedRows = insertCommand.ExecuteNonQuery();

if(updatedRows>0)
{
 //do something
}
于 2013-04-04T09:00:19.917 回答