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;
}
用非常简单的例子也许开始。只是一个想法。 – 2013-03-27 21:03:28
您可以将ExecuteScalar命令的结果返回给一个对象变量,然后创建一个DataSet并将结果放入DataSet中。 – Melanie 2013-03-27 21:05:35
@ Aaron Bertrand它不是一个理论问题。它是一个真实的世界应用我正在寻找特定代码中的问题。 – user1431356 2013-03-27 21:06:52