繁体   English   中英

尝试使用C#将数据数组保存在数据库中

[英]Trying to save array of data in database using c#

我试图将数据数组保存在数据库中如何实现它。

我有一个表格,其中三个输入PRODUCT_ID,TDC_NO,REVISION以及动态生成的值的数组列表(sizeMin,sizeMax,tolMin,tolMax)。 我想将那些动态生成的值存储在Prop_detail ,我将在Prop_detail其结构,并将PRODUCT_ID,TDC_NO,REVISION值存储在我在下面设计其结构的tdcProduct1表中。如何将这些值列表从服务器端传递到数据库。以及如何进一步存储在数据库中。

.aspx

<script type="text/javascript">
  $(document).on("click", "[id*=btnFrmSubmit]", function () {   
var user = {};
                user.PRODUCT_ID = 1;
                user.TDC_NO = $("[id*=Tdc_No]").val();
                user.REVISION = $("#Revision").text();
/* Creating Array object as WireDimDetails to add in user object*/
                var WireDimDetails = new Array();
                $("#WireDimTbl tbody tr").each(function () {
                    var row = $(this);
                    /* Declare and sets the WireDimDetail object with the property which will add in WireDimDetails array object*/
                    var WireDimDetail = {};
                    var sizeMin = row.find("[id^=SizeMin]").val();
                    /* Checking if control exist or not else assign empty value in sizeMax*/
                    var sizeMax = row.find("[id^=SizeMax]") != "undefined" ? row.find("[id^=SizeMax]").val() : "";
                    var tolMin = row.find("[id^=TolMin]").val();
                    var tolMax = row.find("[id^=TolMax]").val();
                    /*Sets the Values of controls */
                    WireDimDetail.SizeMin = sizeMin;
                    WireDimDetail.SizeMax = sizeMax;
                    WireDimDetail.TolMin = tolMin;
                    WireDimDetail.TolMax = tolMax;
                    /*Add WireDimDetail object in WireDimDetails Array object*/
                    WireDimDetails.push(WireDimDetail);
                })
                /*Add WireDimDetails array of object to user object*/
                user.WireDimDetails = WireDimDetails;
$.ajax({
                    type: "POST",
                    url: "TDC.aspx/SaveFrmDetails",
data: JSON.stringify({ user: user, }),
contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (response) {
                        alert("Data has been added successfully.");
                        window.location.reload();
                    },
                    error: function (response) { alert(response.responseText); }
                });
</script>

服务器端

[WebMethod]    
public static void SaveFrmDetails(User user)
{
    string connectionString = ConfigurationManager.ConnectionStrings["conndbprodnew"].ConnectionString;

    using (OracleConnection con = new OracleConnection(connectionString))
    {
        using (OracleCommand cmd = new OracleCommand("INSERT INTO TDC_PRODUCT1(PRODUCT_ID,TDC_NO, REVISION) VALUES (:PRODUCT_ID,:TDC_NO,:REVISION )",con))
        { 
            cmd.CommandType = CommandType.Text;

            List<WireDimDetail> wireDimDetails = user.WireDimDetails;

            for (int i = 0; i < wireDimDetails.Count; i++)
            {
                WireDimDetail wireDimDetail = wireDimDetails[i];
                string sizeMin = wireDimDetail.SizeMin;
                string sizeMax = !string.IsNullOrEmpty(wireDimDetail.SizeMax) ? wireDimDetail.SizeMax : "0"; // set default value
                string tolMin = wireDimDetail.TolMin;
                string tolMax = wireDimDetail.TolMax;
            }

            cmd.Parameters.AddWithValue(":PRODUCT_ID",user.PRODUCT_ID);
            cmd.Parameters.AddWithValue(":TDC_NO", user.TDC_NO);
            cmd.Parameters.AddWithValue(":REVISION", user.REVISION);

            cmd.Connection = con;

            con.Open();
            cmd.ExecuteNonQuery();
            con.Close();
        }
    }
}

用于保存数据的表结构和数据的数组列表, tdcProduct1表由三列组成:

Productid | Tdc_no | Revision

第二张表Prop_detail

Tdc_no | Tdc_property

我关心的是如何使用SaveFrmDetails将数据同时存储在Prop_detail表中,同时如何将数据存储在tdcProduct1中。 任何想法,将不胜感激。

我认为您想为每个用户保存多个WireDimDetailProp_detail

因此,一种简单的方法是遍历wireDimDetails并获取wireDimDetail字符串以插入Tdc_property

TDC_PRODUCT1插入row TDC_PRODUCT1 ,要插入详细信息,代码将类似于:

[WebMethod]
public static void SaveFrmDetails(User user)
{
    string connectionString = ConfigurationManager.ConnectionStrings["conndbprodnew"].ConnectionString;
    using (OracleConnection con = new OracleConnection(connectionString))
    {
        using (OracleCommand cmd = new OracleCommand("INSERT INTO TDC_PRODUCT1(PRODUCT_ID,TDC_NO, REVISION) VALUES (:PRODUCT_ID,:TDC_NO,:REVISION )", con))
        {
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.AddWithValue(":PRODUCT_ID", user.PRODUCT_ID);
            cmd.Parameters.AddWithValue(":TDC_NO", user.TDC_NO);
            cmd.Parameters.AddWithValue(":REVISION", user.REVISION);
            cmd.Connection = con;
            con.Open();
            cmd.ExecuteNonQuery();

            cmd.CommandText = "insert into Prop_detail(Tdc_no,Tdc_property) values(@tdN,@tdProp)";
            foreach (WireDimDetail wireDimDetail in user.WireDimDetails)
            {
                cmd.Parameters.Clear();
                var stringwriter = new System.IO.StringWriter();
                var serializer = new System.Xml.Serialization.XmlSerializer(wireDimDetail.GetType());
                serializer.Serialize(stringwriter, wireDimDetail);

                cmd.Parameters.AddWithValue("@tdN", user.TDC_NO);
                cmd.Parameters.AddWithValue("@tdProp", stringwriter.ToString());
                cmd.ExecuteNonQuery();
            }

            con.Close();
        }
    }
}

字符串stringwriter是每个WireDimDetail字符串。

但是如果您要为sizeMinsizeMaxtolMintolMax新建记录, sizeMin foreach循环更改为:

foreach (WireDimDetail wireDimDetail in user.WireDimDetails)
{
    cmd.Parameters.Clear();
    string[] strNumbers = new string[4]
    {
        wireDimDetail.SizeMin,
        !string.IsNullOrEmpty(wireDimDetail.SizeMax) ? wireDimDetail.SizeMax : "0",
        wireDimDetail.TolMin,
        wireDimDetail.TolMax
    };
    foreach (string number in strNumbers)
    {
        cmd.Parameters.AddWithValue("@tdN", user.TDC_NO);
        cmd.Parameters.AddWithValue("@tdProp", number);
        cmd.ExecuteNonQuery();
    }
}

编辑:

最后的尝试将是:

[WebMethod]
public static void SaveFrmDetails(User user)
{
    string connectionString = ConfigurationManager.ConnectionStrings["conndbprodnew"].ConnectionString;
    using (OracleConnection con = new OracleConnection(connectionString))
    {
        using (OracleCommand cmd = new OracleCommand("INSERT INTO TDC_PRODUCT1(PRODUCT_ID,TDC_NO, REVISION) VALUES (:PRODUCT_ID,:TDC_NO,:REVISION )", con))
        {
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.AddWithValue(":PRODUCT_ID", user.PRODUCT_ID);
            cmd.Parameters.AddWithValue(":TDC_NO", user.TDC_NO);
            cmd.Parameters.AddWithValue(":REVISION", user.REVISION);
            cmd.Connection = con;
            con.Open();
            cmd.ExecuteNonQuery();

            cmd.CommandText = "insert into Prop_detail(Tdc_no,Rowno,Prop_Name,Tdc_property) values(@tdN,@rowNo,@propN,@tdProp)";
            int rowNum = 1;// You can get rowNum from DB and initiate it to last rowNum
            foreach (WireDimDetail wireDimDetail in user.WireDimDetails)
            {
                cmd.Parameters.Clear();
                Dictionary<string, string> strNumbers = new Dictionary<string, int>()
                    {
                    {"sizMin",  wireDimDetail.SizeMin },
                    {"sizeMax" , !string.IsNullOrEmpty(wireDimDetail.SizeMax) ? wireDimDetail.SizeMax.ToString() : "0" },
                    {"tolMin",   wireDimDetail.TolMin.ToString() },
                    {"tolMax",   wireDimDetail.TolMax.ToString() }
                    }; 
                cmd.Parameters.Clear();

                foreach (KeyValuePair<string, string> kvp in strNumbers)
                {
                    cmd.Parameters.AddWithValue("@tdN", user.TDC_NO);
                    cmd.Parameters.AddWithValue("@rowNo", rowNum);
                    cmd.Parameters.AddWithValue("@propN", kvp.Key);
                    cmd.Parameters.AddWithValue("@tdProp", kvp.Value);
                    cmd.ExecuteNonQuery();

                }
                rowNum++;
            }
            con.Close();
        }
    }
}

笔记:

可以从DB中检索到1- rowNum ,然后增加(可以通过select max(rowNo) from Prop_detail )。

2-我用字典保存变量名,例如sizeMax等,有很多方法可以做到这一点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM