c#値外部キーを挿入します -- c# フィールド と sql フィールド と ado.net フィールド 関連 問題

C# Insert Value Foreign Key












1
vote

問題

日本語

私はテーブルカステロメソとテーブル捕獲療法である2つのテーブルを持っています。 TableCustomerLoginのための外部キーがあります。 cust_id

テーブルカステロメソール中の、私はテーブルカステロメソール

を持っています <事前> <コード> cust_login_id cust_id cust_email cust_username cust_password

およびTableCustomerRegister、

<事前> <コード> tableCustomerRegister cust_id cust_fullname cust_username cust_email cust_password cust_mobile_number cust_image cust_address1 cust_address2 cust_city cust_postcode cust_create_acc_time

顧客登録時に、データはTableCustomerRegisterに格納されます。 TableCustomerLoginに登録する方法

<事前> <コード> string sql = @"INSERT INTO tableCustomerRegister VALUES (@cust_fullname, @cust_username, @cust_email, @password, @cust_mobile_phone, @cust_address1, @cust_address2, @cust_image, @cust_city, @cust_state, @cust_postcode, @cust_create_acc_time, @role, @enabled)"; SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.AddWithValue("@cust_fullname", txtFirstName.Text + " " + txtLastName.Text); cmd.Parameters.AddWithValue("@cust_username", txtUsername.Text); cmd.Parameters.AddWithValue("@cust_email", txtEmail.Text); cmd.Parameters.AddWithValue("@password", passwordhash); cmd.Parameters.AddWithValue("@cust_mobile_phone", txtMobilePhone.Text); cmd.Parameters.AddWithValue("@cust_address1", txtAddress1.Text); cmd.Parameters.AddWithValue("@cust_address2", txtAddress2.Text); cmd.Parameters.AddWithValue("@cust_image", txtProfilePicture.Text); cmd.Parameters.AddWithValue("@cust_city", ICityString()); cmd.Parameters.AddWithValue("@cust_state", ddState.SelectedValue.ToString()); cmd.Parameters.AddWithValue("@cust_postcode", txtPostcode.Text); cmd.Parameters.AddWithValue("@cust_create_acc_time", DateTime.Now); cmd.Parameters.AddWithValue("@role", "user"); cmd.Parameters.AddWithValue("@enabled", enabled); try { conn.Open(); cmd.ExecuteNonQuery(); lblStatus.Text = "Status: Data successfully saved."; }
英語

I have 2 tables which are tableCustomerLogin and tableCustomerRegister. There is Foreign Key for the tableCustomerLogin i.e. cust_id.

In the tableCustomerLogin, I have tableCustomerLogin

    cust_login_id     cust_id     cust_email     cust_username     cust_password 

and for tableCustomerRegister,

    tableCustomerRegister     cust_id     cust_fullname     cust_username     cust_email     cust_password     cust_mobile_number     cust_image     cust_address1     cust_address2     cust_city     cust_postcode     cust_create_acc_time 

When customer register, the data will store in the tableCustomerRegister. How to make it register in the tableCustomerLogin?

string sql = @"INSERT INTO tableCustomerRegister VALUES (@cust_fullname, @cust_username, @cust_email, @password, @cust_mobile_phone, @cust_address1, @cust_address2, @cust_image, @cust_city, @cust_state, @cust_postcode, @cust_create_acc_time, @role, @enabled)";              SqlCommand cmd = new SqlCommand(sql, conn);             cmd.Parameters.AddWithValue("@cust_fullname", txtFirstName.Text + " " + txtLastName.Text);             cmd.Parameters.AddWithValue("@cust_username", txtUsername.Text);             cmd.Parameters.AddWithValue("@cust_email", txtEmail.Text);             cmd.Parameters.AddWithValue("@password", passwordhash);             cmd.Parameters.AddWithValue("@cust_mobile_phone", txtMobilePhone.Text);             cmd.Parameters.AddWithValue("@cust_address1", txtAddress1.Text);             cmd.Parameters.AddWithValue("@cust_address2", txtAddress2.Text);             cmd.Parameters.AddWithValue("@cust_image", txtProfilePicture.Text);             cmd.Parameters.AddWithValue("@cust_city", ICityString());             cmd.Parameters.AddWithValue("@cust_state", ddState.SelectedValue.ToString());             cmd.Parameters.AddWithValue("@cust_postcode", txtPostcode.Text);             cmd.Parameters.AddWithValue("@cust_create_acc_time", DateTime.Now);             cmd.Parameters.AddWithValue("@role", "user");             cmd.Parameters.AddWithValue("@enabled", enabled);             try             {                 conn.Open();                 cmd.ExecuteNonQuery();                 lblStatus.Text = "Status: Data successfully saved.";             } 
</div
        
     
     

回答リスト

1
 
vote
vote
ベストアンサー
 

まず最初にあなたの照会を変更する必要があります

<事前> <コード> string sql = @"INSERT INTO tableCustomerRegister OUTPUT INSERTED.cust_id VALUES (@cust_fullname, @cust_username, @cust_email, @password, @cust_mobile_phone, @cust_address1, @cust_address2, @cust_image, @cust_city, @cust_state, @cust_postcode, @cust_create_acc_time, @role, @enabled)"; SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.AddWithValue("@cust_fullname", txtFirstName.Text + " " + txtLastName.Text); cmd.Parameters.AddWithValue("@cust_username", txtUsername.Text); //so on (all your parameters) var custid = (int)cmd.ExecuteScalar()

ExecuteScalar int intを返します。この場合は、 OUTPUT INSERTED.cust_id cust_id5 cust_id を返します。これで、 tableCustomerRegister に保存されている挿入された cust_id があります。外部キー cust_id を使用して、データを保存するための別のクエリを TableCustomerLogin に保存する必要があります。このように、

<事前> <コード> string Sql2 = "INSERT INTO tableCustomerLogin (column_names) VALUES (parameters values)"; SqlCommand cmd = new SqlCommand(sq2, conn); cmd.Parameters.AddWithValue("@cust_id",custid); //as foreign key //all other Parameters
 

well, first of all you need to change your query

string sql = @"INSERT INTO tableCustomerRegister  OUTPUT INSERTED.cust_id VALUES (@cust_fullname, @cust_username, @cust_email, @password, @cust_mobile_phone, @cust_address1, @cust_address2, @cust_image, @cust_city, @cust_state, @cust_postcode, @cust_create_acc_time, @role, @enabled)";  SqlCommand cmd = new SqlCommand(sql, conn);         cmd.Parameters.AddWithValue("@cust_fullname", txtFirstName.Text + " " + txtLastName.Text);         cmd.Parameters.AddWithValue("@cust_username", txtUsername.Text); //so on (all your parameters) var custid  = (int)cmd.ExecuteScalar() 

ExecuteScalar return int, in this case it will return cust_id as your query have OUTPUT INSERTED.cust_id. Now You have your inserted cust_id saved in tableCustomerRegister. Now all you need to do just write another query for save data into your tableCustomerLogin with foreign key cust_id. like this,

string Sql2 = "INSERT INTO tableCustomerLogin (column_names) VALUES (parameters values)"; SqlCommand cmd = new SqlCommand(sq2, conn); cmd.Parameters.AddWithValue("@cust_id",custid);  //as foreign key //all other Parameters 
</div
 
 
1
 
vote

最初の insert 998876610 レコード、次に 998876611 <div class="container"> <div class="row"> <div class="box"></div> <div class="box"></div> </div> <div class="row"> <div class="box"></div> <div class="box"></div> </div> </div>2 テーブル。 トランザクションブロックでこれをよりよくするでしょう。

<div class="container"> <div class="row"> <div class="box"></div> <div class="box"></div> </div> <div class="row"> <div class="box"></div> <div class="box"></div> </div> </div>3 <div class="container"> <div class="row"> <div class="box"></div> <div class="box"></div> </div> <div class="row"> <div class="box"></div> <div class="box"></div> </div> </div>4 テーブルに追加することができます。

<事前> <コード> <div class="container"> <div class="row"> <div class="box"></div> <div class="box"></div> </div> <div class="row"> <div class="box"></div> <div class="box"></div> </div> </div>5
 

You can first insert a tableCustomerRegister record and then insert another data the tableCustomerLogin table. You would be better do this in the transaction block.

The other way , You can add a trigger to the tableCustomerLogin table.

CREATE TRIGGER trg_tableCustReg ON tableCustomerRegister FOR INSERT AS      /*    *  if CustLoginID is a identity , no dont need to add      */      INSERT INTO tableCustomerLogin              (cust_login_id, cust_id, cust_email, cust_username, cust_password)         Select             'CustLoginID',              cust_id ,              cust_email,              cust_username,              user_password             FROM inserted  go 
</div
 
 
0
 
vote

おそらく最善の解決策は乾燥原理に従うことです、あなた自身を繰り返してはいけない。

たとえば、単一の情報を単一のテーブルCustomer_Tableに保存してから、必要なデータをこのテーブルのみからより簡単なロジックでリトライブできます。

代わりに、実際のデータ構造に滞在したい場合は、SEMICOLON

で最初のスケリュレート後に新しいINSERTステートメントを追加するだけです。

一度に複数のテーブルにデータを挿入する方法

 

Probably the best solution is to follow the DRY principle, Dont Repeat Yourself.

I think that you can store all information in a single table customer_table for example and then retrive the necessary data with a more simple logic from only this table.

Instead, if you want to stay on your actual data structure, simply add new insert statement after firstseparate by semicolon

how to insert data into multiple tables at once

</div
 
 
0
 
vote

2つの異なる方法があります。あなたは scope_identity

<事前> <コード> cust_id16

scope_identity 最後に挿入された最後のアイデンティティ値を返します。 同じスコープ

のID列
<事前> <コード> <div class="container"> <div class="row"> <div class="box"></div> <div class="box"></div> </div> <div class="row"> <div class="box"></div> <div class="box"></div> </div> </div>7

NewID cust_id

のための新しい主キーIDを作成しました

この id(cust_id)を持ち、ログインテーブルに登録できます。

<事前> <コード> <div class="container"> <div class="row"> <div class="box"></div> <div class="box"></div> </div> <div class="row"> <div class="box"></div> <div class="box"></div> </div> </div>8
 

there are two different way. you shold use SCOPE_IDENTITY

string sql = @"INSERT INTO tableCustomerRegister VALUES (@cust_fullname, @cust_username, @cust_email, @password, @cust_mobile_phone, @cust_address1, @cust_address2, @cust_image, @cust_city, @cust_state, @cust_postcode, @cust_create_acc_time, @role, @enabled) SELECT SCOPE_IDENTITY()"; 

SCOPE_IDENTITY Returns the last identity value inserted into an identity column in the same scope

var newId= cmd.ExecuteScaler(); 

newId created new Primary Key ID for you cust_id

you have this ID(cust_id) and you can register in the Login table.

INSERT INTO  tableCustomerLogin (cust_login_id,**cust_id**,cust_email,cust_username,cust_password)   cust_id = newId  
</div
 
 
 
 
0
 
vote

TableCustomerRegisterテーブルでcust_idが自動作成されている場合は、同じIDをTableCustomerLoginテーブル(CUST_ID)に保存できます。それからあなたの外部キーの関係のみ。

<事前> <コード> <div class="container"> <div class="row"> <div class="box"></div> <div class="box"></div> </div> <div class="row"> <div class="box"></div> <div class="box"></div> </div> </div>9
 

If Cust_id is auto-created in the tableCustomerRegister table, then you can save the same id in the tableCustomerLogin table (cust_id). then only your foreign Key relation work.

     try                     {                         conn.Open();                         cmd.ExecuteNonQuery();                         SqlCommand get_custid_cmd = new SqlCommand("select @@identity", conn);                         int cust_id = Convert.ToInt32(get_custid_cmd.ExecuteScalar());                         string sql_insert = @"INSERT INTO tableCustomerLogin VALUES (@cust_id, @cust_username, @cust_email, @password)";                  SqlCommand cmd_insert = new SqlCommand(sql_insert, conn);                 cmd_insert.Parameters.AddWithValue("@cust_id",cust_id);                 cmd_insert.Parameters.AddWithValue("@cust_username", txtUsername.Text);                 cmd_insert.Parameters.AddWithValue("@cust_email", txtEmail.Text);                 cmd_insert.Parameters.AddWithValue("@password", passwordhash);                 cmd_insert.ExecuteNonQuery();                             lblStatus.Text = "Status: Data successfully saved.";                      } 
</div
 
 

関連する質問

13  モデルクラスを作成するか、一般的なデータベースユーティリティクラスを使用してスティックを作成するのが良いですか?  ( Is it better to create model classes or stick with generic database utility clas ) 
私達は私達のデータベース呼び出し(ado.netの周囲のライトラッパー)のための簡単なユーティリティクラスを持っていますが、それぞれのデータベース/オブジェクトのクラスを作成することを考えています。それはそうするのは賢いことになるでしょうか、それとも私たちがA...

10  DBCOMMAND.CLOSE()は接続を閉じますか?  ( Will dbcommand close close the connection as well ) 
次のADO.NETコードがあります。を使ってを使ってDBコマンドを描く場合は、下の接続を明示的に閉じる必要がありますか? ありがとう、 <事前> <コード> public static void ExecuteSQL(int Id) ...

4  DataTableへのLINQ2SQL  ( Linq2sql to datatable ) 
LINQ2SQLテーブルをADO.NETのデータ型にコピーする最も簡単な方法は何ですか? ...

12  ADO.NET:DataTableをDataRowsの配列に変換する  ( Ado net convert a datatable to an array of datarows ) 
ADO.NETとC#を使用しています.DataTableオブジェクトをDataRowsの配列に変換します。これを行うエレガントな方法は何ですか? ...

4  ADO.Netエンティティフレームワークの関連付けに追加のフィールドを追加する方法はありますか?  ( Is there a way to add extra fields to an association in the ado net entity frame ) 
関係についての詳細な詳細を持つ多くの人の関係をモデル化できるようにしたいと思います。例えば: <事前> <コード> Person: int id, String name Project: int id, String name ProjectPerson:...

3  DataTableからの書き込み時にXML出力の形式を指定する方法  ( How to specify format of xml output when writing from a datatable ) 
C#では、DataTable.WriteXML(FilePath)を使用してDataTableからXMLファイルを作成しています。 <事前> <コード> <?xml version="1.0" encoding="utf-8" ?> <ExperienceP...

12  activator.CreateInstance秘密の密封クラス  ( Activator createinstance with private sealed class ) 
System.Data.sqlclient.sqlCommandsetのプライベートクラスであるLocalCommandインスタンスを新しくアップしようとしています。私はタイプ情報をつかむことができるようです。 <事前> <コード> Assembly sys...

0  SQL Serverへのデータの保存に関するSQLException  ( Sqlexception on storing data into sql server ) 
SQL Serverデータベースにデータを挿入するときは、次の例外が表示されます。 system.data.sqlclient.SQLException:文字列またはバイナリデータは切り捨てられます。 ステートメントは終了しました。 Syste...

18  ado.netを学ぶ方法  ( How to learn ado net ) 
MSオフィスに基づくアプリケーションを構築するためにADO.NETを学ぶ必要があります。私はMSDNライブラリのado.netについてよく読んでいますが、すべてが私にかなり厄介なようです。 ADO.NETを使用するときに基本的なものは把握する必要があります...

2  関数を呼び出すときに、Oracle NumberとVARCHAR2に関連付けられているOLEDBTYPEとは何ですか  ( What are the oledbtypes associated with oracle number and varchar2 when calling ) 
OLEDBパラメータをOracle関数にマッピングしようとしています。私はsystem.data.oracleネームスペースを使ってこれを行うことができましたが、これは解説していることを発見したので、OrdDBとしてそれを再書き込むと思いました。 例として次...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有