2013-04-04 40 views
1

如何根据这些说明知道数据库中的表是否受影响?我尝试在控制台中显示查询结果,但它不显示任何内容。SQL连接命令不会更改数据

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

是什么控制台实际上写?错误,没有,...?另外,你的insertCommand是错误的 - 你必须使用参数替换,而不是将'date'变量放在文本字符串中。 – 2013-04-04 08:59:20

回答

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块妥善处理对象
+0

好的。谢谢!但是当我试图读取_影响时,控制台没有显示结果。我的连接字符串是否以正确的格式写入?我的表的文件名是Rates_Table.sql,它在Rates_DB文件 – Lusine 2013-04-04 09:04:09

+0

中,您的连接字符串错误。 – 2013-04-04 09:04:56

+0

'Data Source = myServerAddress; Initial Catalog = myDataBase; Integrated Security = SSPI; 用户ID = myUsername;密码= myPassword;' – 2013-04-04 09:05:51

0

ExecuteNonQuery()返回表示受影响的行的数量的整数。 ExecuteNonQuery

可以使用ExecuteNonQuery来执行目录操作( 例如,查询数据库的结构或创建数据库 对象,如表),或使用一个数据集来改变在数据库中的数据,而不 通过执行UPDATE,INSERT或DELETE语句。 虽然ExecuteNonQuery不返回任何行,但任何输出参数或映射到参数的返回值都将填充数据。

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

尝试这样

int updatedRows = insertCommand.ExecuteNonQuery(); 

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

我认为ü都出现了以数据表SqlDataAdapter对象秀,还可以使用参数插入字符串如USD