【问题标题】:How to save database after SQL query ADO.NET?SQL查询ADO.NET后如何保存数据库?
【发布时间】:2013-07-27 03:57:25
【问题描述】:

我已经连接到数据库

public SqlConnection CreateConnection()
{
    var con = new SqlConnection(s_connection);
    con.Open();
    return con;
}

在此连接后我有一个INSERT 查询:

SqlCommand myCommand = CreateConnection().CreateCommand();
myCommand.CommandText = "INSERT INTO Departments(Name, Phone) VALUES (@Name, @Phone);";
myCommand.Parameters.Add("@Name", SqlDbType.NVarChar, 20);
myCommand.Parameters["@Name"].Value = d.Name;
myCommand.Parameters.Add("@Phone", SqlDbType.NVarChar, 20);
myCommand.Parameters["@Phone"].Value = d.Phone;
myCommand.ExecuteNonQuery();

我想使用SELECT 查询从数据库中获取日期,但我没有得到查询后添加的任何新数据。如果我重置程序,我会看到所有数据(INSERT 查询有效!)我该如何解决这个问题?

【问题讨论】:

  • 在完成INSERT 之后,你在做SELECT 吗?您必须重新加载数据才能查看新插入的数据。
  • Depratments 表中有 ID 列吗?日期(您需要的日期是否位于 Departments 表中?
  • 如果添加行,很多时候“表示层应用程序”将不得不重新发出选择查询......以获取数据。有人称之为“重新绑定”数据。插入后是否希望查看所有部门(在网格或其他内容中)?
  • 我在您的问题中没有看到任何 SELECT 命令。您在哪里以及如何做到这一点?

标签: c# sql-server ado.net


【解决方案1】:

您可以使用 ExecuteScalar() 函数

static public int AddProductCategory(string newName, string connString)
{
 Int32 newProdID = 0;
string sql =
    "INSERT INTO Production.ProductCategory (Name) VALUES (@Name); "
    + "SELECT CAST(scope_identity() AS int)";
using (SqlConnection conn = new SqlConnection(connString))
{
    SqlCommand cmd = new SqlCommand(sql, conn);
    cmd.Parameters.Add("@Name", SqlDbType.VarChar);
    cmd.Parameters["@name"].Value = newName;
    try
    {
        conn.Open();
        newProdID = (Int32)cmd.ExecuteScalar();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}
return (int)newProdID;
}

【讨论】:

    【解决方案2】:

    首先,您需要更改您的INSERT 语句。您需要返回新插入行的ID

    Int NewID = 0;
    SqlCommand myCommand = CreateConnection().CreateCommand();
    myCommand.CommandText = "INSERT INTO Departments (Name, Phone) VALUES (@Name, @Phone) SELECT SCOPE_IDENTITY()";
    myCommand.Parameters.Add("@Name", SqlDbType.NVarChar, 20);
    myCommand.Parameters["@Name"].Value = d.Name;
    myCommand.Parameters.Add("@Phone", SqlDbType.NVarChar, 20);
    myCommand.Parameters["@Phone"].Value = d.Phone;
    
    // We will use ExecuteScalar that will return the ID of newly inserted row instead of ExecuteNonQuery
    NewID = myCommand.ExecuteScalar();
    

    现在您可以使用 NewId 来获取您的数据,General 语句如下所示:

    Select DateColumn From Deprtments Where IdColumn = NewId
    

    另外,请注意,我们在 CommandText 中使用了 SCOPE_IDENTITY,它返回刚刚插入的行的 IDRead more about SCOPE_IDENTITY.

    我不确定您是否需要检索 Departments 表的所有详细信息,如果是,请坚持上述解决方案。如果您只关心新添加记录的日期,那么您可以考虑返回日期而不是 ID。声明看起来像这样:

    INSERT INTO Departments (Name, Phone) VALUES (@Name, @Phone) SELECT DateCol From Department Where IdCol = SCOPE_IDENTITY()
    

    以上语句将仅使用您的Insert 语句返回日期。您无需再写一个Select 来检索日期

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      相关资源
      最近更新 更多