C#で注文フォームを作成するには、サポートが必要です。私の開発環境は次のとおりです。
- Microsoft Visual Studio 2010 Ultimate
- SQL Server Express Edition 2005
- プログラミング言語C#
- サンプルデータベース=
NorthWind
(テーブルOrders
とOrderDetails
)
注文入力用のフォームを作成しました。このフォームには、のテキストボックスOrderID
、のコンボボックス、およびのCustomer
DateTimePickersと、列、、、およびを含むDataGridViewが含まれてOrderDate
います。ShippedDate
OrderID (readonly)
ProductID
UnitPrice
Quantity
フォームのロードイベントには、次のコードがあります。
private void Inv2_Load(object sender, EventArgs e)
{
SetComb();
connectionString = ConfigurationManager.AppSettings["connectionString"];
sqlConnection = new SqlConnection(connectionString);
qryOrd = "Select OrderID, CustomerID, OrderDate, ShippedDate from Orders";
qryOrdDet = "Select OrderID, ProductID, UnitPrice, Quantity from OrderDetails";
sqlConnection.Open();
sqlDataMaster = new SqlDataAdapter(qryOrd, sqlConnection);
sqlDataDet = new SqlDataAdapter(qryOrdDet, sqlConnection);
//SET MASTER INSERT/UPDATES
command = new SqlCommand("INSERT INTO Orders ( CustomerID, OrderDate, ShippedDate) VALUES (@CustID, @OrdDt, @ShipDt) SELECT SCOPE_IDENTITY();");
command.Parameters.Add("@OrdID", SqlDbType.NVarChar, 15);
command.Parameters.Add("@CustID", SqlDbType.VarChar, 15);
command.Parameters["@CustID"].Value = cmbCust.SelectedText;
command.Parameters.Add("@OrdDt", SqlDbType.DateTime);
command.Parameters["@OrdDt"].Value = dtOrdDt.Text;
command.Parameters.Add("@ShipDt", SqlDbType.DateTime);
command.Parameters["@ShipDt"].Value =dtShipDt.Text;
sqlDataMaster.InsertCommand = command;
//string id = command.ExecuteScalar().ToString();
command = new SqlCommand("UPDATE Orders SET CustomerID = @CustID, OrderDate = @OrdDt, ShippedDate = @ShipDt WHERE OrderID = @OrdID");
command.Parameters.Add("@OrdID", SqlDbType.NVarChar, 15, "OrderID").Value = txtOrdID.Text;
command.Parameters.Add("@CustID", SqlDbType.VarChar, 15, "CustomerID").Value = cmbCust.Text;
command.Parameters.Add("@OrdDt", SqlDbType.DateTime).Value = dtOrdDt.Text;
command.Parameters.Add("@ShipDt", SqlDbType.DateTime).Value = dtShipDt.Text;
sqlDataMaster.UpdateCommand = command;
//SET DETAILS INSERT/UPDATES
commandDet = new SqlCommand("INSERT INTO OrderDetails (ProductID, UnitPrice, Quantity) VALUES (@PrdID, @Up,@Qty)");
//commandDet.Parameters.Add("@OrdID", SqlDbType.NVarChar, 15, "OrderID").Value = txtOrdID.Text; ;
commandDet.Parameters.Add("@PrdId", SqlDbType.NVarChar, 5, "ProductID");
commandDet.Parameters.Add("@Up", SqlDbType.VarChar, 50, "UnitPrice");
commandDet.Parameters.Add("@Qty", SqlDbType.VarChar, 20, "Quantity");
sqlDataDet.InsertCommand = commandDet;
commandDet = new SqlCommand("UPDATE OrderDetails SET ProductID = @PrdID, UnitPrice = @Up, Quantity = @Qty WHERE OrderID = @OrdID");
commandDet.Parameters.Add("@OrdID", SqlDbType.NVarChar, 15, "OrderID").Value = txtOrdID.Text; ;
commandDet.Parameters.Add("@PrdId", SqlDbType.NVarChar, 5, "ProductID");
commandDet.Parameters.Add("@Up", SqlDbType.VarChar, 50, "UnitPrice");
commandDet.Parameters.Add("@Qty", SqlDbType.VarChar, 20, "Quantity");
sqlDataDet.UpdateCommand = commandDet;
sqlComBldMaster = new SqlCommandBuilder(sqlDataMaster);
sqlComBldDet = new SqlCommandBuilder(sqlDataDet);
dt = new DataTable();
dtDet = new DataTable();
dt.Clear();
dtDet.Clear();
sqlDataMaster.FillSchema(dt, SchemaType.Source);
sqlDataDet.FillSchema(dtDet, SchemaType.Source);
dtDet.Columns["OrderID"].AutoIncrement = true;
dtDet.Columns["OrderID"].AutoIncrementSeed = -1;
dtDet.Columns["OrderID"].AutoIncrementStep = -1;
ds = new DataSet();
ds.Tables.Add(dt);
ds.Tables.Add(dtDet);
ds.EnforceConstraints = false;
DataRelation rel = new DataRelation("OrdersRel", ds.Tables["Orders"].Columns["OrderID"], ds.Tables["OrderDetails"].Columns["OrderID"]);
ds.Relations.Add(rel);
bs = new BindingSource();
bsDet = new BindingSource();
bs.DataSource = ds;
bs.DataMember = "Orders";
bsDet.DataSource = ds;
bsDet.DataMember = "OrderDetails";
dgInvDet.AutoGenerateColumns = false;
dgInvDet.Columns["ProductID"].DataPropertyName = "ProductID";
ProductID.DataSource = dm.GetData("Select * from Products order by ProductName");
ProductID.DisplayMember = "ProductName";
ProductID.ValueMember = "ProductID";
dgInvDet.Columns["UnitPrice"].DataPropertyName = "UnitPrice";
dgInvDet.Columns["Quantity"].DataPropertyName = "Quantity";
dgInvDet.DataSource = bsDet;
}
public void SetComb()
{
cmbCust.DataSource = dm.GetData("Select * from Customers order by CompanyName");
cmbCust.DisplayMember = "CompanyName";
cmbCust.ValueMember = "CustomerId";
cmbCust.Text = "";
}
Dm.GetData
行を取得するためだけに作成されたデータアクセスクラスメソッドです。
そして、Save
ボタンクリックイベントでは:
private void btnSave_Click(object sender, EventArgs e)
{
dt.EndInit();
rec = sqlDataMaster.Update(ds.Tables[0]);
rec += sqlDataDet.Update(ds.Tables[1]);
//recDet = sqlDataDet.Update(dt);
ds.AcceptChanges();
MessageBox.Show(rec + " record(s) applied...." );
ds.EnforceConstraints = true;
}
私が必要としているのは、データをSQL Serverのそれぞれのテーブル(Orders
およびOrderDetails
)に保存することです。これは、私のコードでは実行できないようです。外部キーをnullにできないというエラーが表示されます...OrderDetails
テーブルにも外部キーが必要であり、データがデータベースに挿入された後に自動生成されるOrderID
ため、どうすれば取得できるのか理解できません。OrderID
この外部キーの問題でデータベースにデータを保存するために、この問題について私を助けてください...
どんな助けでも大歓迎です。
ありがとう
アーメド