Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL连接命令不会更改数据_C#_Visual Studio 2012_Sqlconnection - Fatal编程技术网

C# SQL连接命令不会更改数据

C# SQL连接命令不会更改数据,c#,visual-studio-2012,sqlconnection,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/

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

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());
    }
}
ExecuteOnQuery返回受影响记录数的整数

int _affected = insertCommand.ExecuteNonQuery();
后续问题

在上面的语句中,值USD和date是真实值,因为如果是,它肯定会抛出异常。它应该用单引号括起来,如下所示:

INSERT INTO Rates_Table(ISO, Amount, Rate, Date) VALUES ('USD', 1, 417.5, '')
因为它们是字符串文字。但在insert语句中插入具有实际值的数据不是正确的方法。这些值应该参数化,以避免sql注入

为了正确编码

使用using语句处理propr对象 使用try catch块正确处理对象 ExecuteOnQuery返回一个显示受影响行数的整数

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

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

像这样试试

int updatedRows = insertCommand.ExecuteNonQuery();

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

我认为您正在向datatable显示SqlDataAdapter对象show,并为插入字符串使用参数,如“USD”

控制台实际上写了什么?错误,什么都没有。。。?另外,insertCommand是错误的-必须使用参数替换,而不是将datevariable放在文本字符串中。Ok。非常感谢。但是当我试图阅读时,控制台没有显示结果。我的连接字符串的格式是否正确?我的表的文件名是Rates\u table.sql,它位于Rates\u DB fileData Source=myServerAddress中;初始目录=myDataBase;综合安全=SSPI;用户ID=我的用户名;密码=我的密码;
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()
        }
    }
}
int updatedRows = insertCommand.ExecuteNonQuery();

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