2013-03-27 54 views
0

下面是我构建的例程,用于处理从SQL Server中的5个表中插入和选择/插入的例程。 Select语句返回一个具有行数的数据表,Inserts不。我相信问题在于SQLAdapter和DataTable之间的绑定。如何从插入中获取SCOPE_IDENTITY到Datatable中的一行?我知道我可以把它作为一个int,但是代码的主体需要一个可返回的数据。从查询到数据表获取SCOPE_IDENTITY()的问题

public DataTable dbQuery(string queryType, modelsClass model) 
{ 
    string query = null; 
    char subQueryType = 'd'; 
    SqlConnection connectionString = new SqlConnection(ConfigurationManager.ConnectionStrings["inventory_v2ConnectionString"].ConnectionString); 
    SqlCommand queryCommand = new SqlCommand(@query, connectionString); 
    SqlDataAdapter sqlAdapt = new SqlDataAdapter(); 
    sqlAdapt.Dispose(); 
    DataTable dt = new DataTable("return"); 

    try 
    { 

     switch(queryType) 
     { 
      case "OEMSelect": 
       { 

        query = "SELECT [ID] FROM [Models_OEMs] WHERE Manufacturer = @OEM"; 
        subQueryType = 'S'; 
        queryCommand.Parameters.Clear(); 
        queryCommand.Parameters.AddWithValue("@OEM",model.OEM); 

        break; 
       } 
      case "PriSelect": 
       { 
        query = "SELECT [ID]FROM [Models_PriModels] WHERE PriModel = @PriModel"; 
        subQueryType = 'S'; 
        queryCommand.Parameters.Clear(); 
        queryCommand.Parameters.AddWithValue("@PriModel", model.PriModel); 
        break; 
       } 
      case "SecSelect": 
       { 
        query = "SELECT [ID] FROM [Models_SecModels] WHERE SecModel = @SecModel"; 
        subQueryType = 'S'; 
        queryCommand.Parameters.Clear(); 
        queryCommand.Parameters.AddWithValue("@SecModel", model.SecModel); 
        break; 
       } 
      case "FormSelect": 
       { 
        query = "SELECT [ID] FROM [Models_FormFactor] WHERE Form = @Form"; 
        subQueryType = 'S'; 
        queryCommand.Parameters.Clear(); 
        queryCommand.Parameters.AddWithValue("@Form", model.FormFactor); 
        break; 
       } 
      case "ModelSelect": 
       { 
        //Does Model Already exist? 
        query = "SELECT [ID] FROM [Models_OEMs] WHERE Manufacturer = @Manufacturer AND PriModel = @PriModelID AND SecModel = @SecModelID AND FormFactor = @FormFactorID"; 
        subQueryType = 'S'; 
        queryCommand.Parameters.Clear(); 
        queryCommand.Parameters.AddWithValue("@Manufacturer", model.OEMID); 
        queryCommand.Parameters.AddWithValue("@PriModel", model.PriModelID); 
        queryCommand.Parameters.AddWithValue("@SecModel", model.SecModelID); 
        queryCommand.Parameters.AddWithValue("@FormFactor", model.FormFactorID); 
        break; 
       } 
      case "OEMInsert": 
       { 
        query = "INSERT INTO Models_OEMs (Manufacturer) VALUES (@OEM); SELECT SCOPE_IDENTITY();"; 
        subQueryType = 'I'; 
        queryCommand.Parameters.Clear(); 
        queryCommand.Parameters.AddWithValue("@OEM", model.OEM); 

        break; 
       } 
      case "PriInsert": 
       { 
        query = "INSERT INTO Models_PriModels (PriModel) VALUES (@PriModel); SELECT SCOPE_IDENTITY();"; 
        subQueryType = 'I'; 
        queryCommand.Parameters.Clear(); 
        queryCommand.Parameters.AddWithValue("@PriModel", model.PriModel); 
        break; 
       } 
      case "SecInsert": 
       { 
        query = "INSERT INTO Models_SecModel (SecModel) VALUES (@SecModel); SELECT SCOPE_IDENTITY();"; 
        subQueryType = 'I'; 
        queryCommand.Parameters.Clear(); 
        queryCommand.Parameters.AddWithValue("@SecModel", model.SecModel); 
        break; 
       } 
      case "FormInsert": 
       { 
        query = "INSERT INTO Models_FormFactor (Form) VALUES (@FormFactor); SELECT SCOPE_IDENTITY();"; 
        subQueryType = 'I'; 
        queryCommand.Parameters.Clear(); 
        queryCommand.Parameters.AddWithValue("@FormFactor", model.FormFactor); 
        break; 
       } 
      case "ModelInsert": 
       { 
        query = "INSERT INTO Models (Manufacturer, PriModel, SecModel, FormFactor, Active) VALUES (@Manufacturer, @PriModel, @SecModel, @FormFactor, 'Y'); SELECT SCOPE_IDENTITY();"; 
        subQueryType = 'I'; 
        queryCommand.Parameters.Clear(); 
        queryCommand.Parameters.AddWithValue("@Manufacturer", model.OEMID); 
        queryCommand.Parameters.AddWithValue("@PriModel", model.PriModelID); 
        queryCommand.Parameters.AddWithValue("@SecModel", model.SecModelID); 
        queryCommand.Parameters.AddWithValue("@FormFactor", model.FormFactorID); 

        break; 
       } 
      default: 
       { 
        subQueryType = 'D'; //Do nothing. The program should never get here. 
        break; 
       } 

     } 

     queryCommand.CommandText = query; 


     switch (subQueryType) 
     { 
      case 'S': 
       { 
        sqlAdapt.SelectCommand = queryCommand; 
        connectionString.Open(); 
        queryCommand.ExecuteNonQuery(); 
        sqlAdapt.Fill(dt); 
        queryCommand.Dispose(); 
        connectionString.Close(); 
        break; 
       } 
      case 'I': 
       { 

        sqlAdapt.InsertCommand = queryCommand; 
        connectionString.Open(); 
        try 
        { 
         DataColumn dc1 = new DataColumn(); 
         dc1.DataType = typeof(String); 
         dc1.ColumnName = "ReturnedID"; 
         dt.Columns.Add(dc1); 
         DataRow dr = dt.NewRow(); 
         dr["ReturnedID"] = queryCommand.ExecuteScalar(); 
         dt.Rows.Add(dr);       
        } 
        catch(Exception ex) 
        { 
         DEBUG.Text = DEBUG.Text + " Insert failed! Error: " + ex.Message; 
        } 
        queryCommand.Dispose(); 
        connectionString.Close();       
        break; 
       } 
      default: 
       { 
        break; 
       } 
     } 

     return dt; 
    } 

    catch (IOException ex) 
    { 
     DEBUG.Text += "Oops! I errored. : " + ex.Message; 
    } 
    return dt; 

} 
+0

用非常简单的例子也许开始。只是一个想法。 – 2013-03-27 21:03:28

+0

您可以将ExecuteScalar命令的结果返回给一个对象变量,然后创建一个DataSet并将结果放入DataSet中。 – Melanie 2013-03-27 21:05:35

+0

@ Aaron Bertrand它不是一个理论问题。它是一个真实的世界应用我正在寻找特定代码中的问题。 – user1431356 2013-03-27 21:06:52

回答

0

谢谢@Melanie的跳开始我的大脑...... 我用替换

queryCommand.ExecuteScalar(); 

解决了这个问题:

DataColumn dc1 = new DataColumn(); 
dc1.DataType = typeof(String); 
dc1.ColumnName = "ReturnedID"; 
dt.Columns.Add(dc1); 
DataRow dr = dt.NewRow(); 
dr["ReturnedID"] = queryCommand.ExecuteScalar(); 
dt.Rows.Add(dr); 
+0

不客气! – Melanie 2013-03-28 20:05:11