【问题标题】:Invalid parameter binding\r\nParameter name: System.DateTime while uploading data to oracle table无效的参数绑定\r\n参数名称: System.DateTime 上传数据到 oracle 表时
【发布时间】:2026-01-15 18:35:01
【问题描述】:

我想在按钮单击时从 Gridview 向数据库中插入记录。

所以我使用this链接插入它。

但是使用下面的代码,我得到了错误

无效的参数绑定\r\n参数名称:System.DateTime

<asp:GridView ID="grdExcelData" runat="server" AutoGenerateColumns="false" AllowPaging="true" PageSize="10" PageIndex="0" CssClass="table table-bordered">
                        <Columns>
                            <asp:BoundField ItemStyle-Width="50px" DataField="R4GSTATE" HeaderText="R4GSTATE" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="POLITICAL_STATE_NAME" HeaderText="POLITICAL_STATE_NAME" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="POLITICAL_STATE_CODE" HeaderText="POLITICAL_STATE_CODE" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="CMP" HeaderText="CMP" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="SAP_ID" HeaderText="SAP_ID" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="SITE_NAME" HeaderText="SITE_NAME" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="RFCDATE" HeaderText="RFCDATE" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="RFS_DATE" HeaderText="RFS_DATE" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="RFE1_DATE" HeaderText="RFE1_DATE" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="SITE_DROP_DATE" HeaderText="SITE_DROP_DATE" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="INFRA_PROVIDER" HeaderText="INFRA_PROVIDER" />                            
                            <asp:BoundField ItemStyle-Width="50px" DataField="IP_COLO_SITEID" HeaderText="IP_COLO_SITEID" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="VENDOR_CODE" HeaderText="VENDOR_CODE" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="MW_INSTALLED" HeaderText="MW_INSTALLED" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="DG_NONDG" HeaderText="DG_NONDG" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="EB_NONEB" HeaderText="EB_NONEB" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="TOWER_TYPE" HeaderText="TOWER_TYPE" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="ID_OD_COUNTCHANGE" HeaderText="ID_OD_COUNTCHANGE" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="ID_OD_CHANGEDDATE" HeaderText="ID_OD_CHANGEDDATE" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="RRH_COUNTCHANGE" HeaderText="RRH_COUNTCHANGE" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="IP_COLO_SITEID" HeaderText="IP_COLO_SITEID" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="RRH_CHANGEDDATE" HeaderText="RRH_CHANGEDDATE" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="TENANCY_COUNTCHANGE" HeaderText="TENANCY_COUNTCHANGE" />
                            <asp:BoundField ItemStyle-Width="50px" DataField="TENANCY_CHANGEDDATE" HeaderText="TENANCY_CHANGEDDATE" />
                        </Columns>
                    </asp:GridView>
                    
Server code                    


protected void btnSubmitUpload_Click(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();

            ViewState["GridData"] = SelectedRecordID;
            dt = ViewState["GridData"] as DataTable;

            if (dt.Rows.Count > 0)
            {
                string consString = ConfigurationManager.ConnectionStrings["ConnectionString_IPCOLO"].ConnectionString;
                using (OracleConnection con = new OracleConnection(consString))
                {
                    con.Open();
                    using (OracleBulkCopy sqlBulkCopy = new OracleBulkCopy(con))
                    {
                        sqlBulkCopy.DestinationTableName = "TBL_IPCOLO_BILLING_MST";

                        sqlBulkCopy.ColumnMappings.Add("R4GSTATE", "R4GSTATE");
                        sqlBulkCopy.ColumnMappings.Add("POLITICAL_STATE_NAME", "POLITICAL_STATE_NAME");
                        sqlBulkCopy.ColumnMappings.Add("POLITICAL_STATE_CODE", "POLITICAL_STATE_CODE");
                        sqlBulkCopy.ColumnMappings.Add("CMP", "CMP");
                        sqlBulkCopy.ColumnMappings.Add("SAP_ID", "SAP_ID");
                        sqlBulkCopy.ColumnMappings.Add("SITE_NAME", "SITE_NAME");
                        sqlBulkCopy.ColumnMappings.Add("RFCDATE", "RFCDATE");
                        sqlBulkCopy.ColumnMappings.Add("RFS_DATE", "RFS_DATE");
                        sqlBulkCopy.ColumnMappings.Add("RFE1_DATE", "RFE1_DATE");
                        sqlBulkCopy.ColumnMappings.Add("SITE_DROP_DATE", "SITE_DROP_DATE");
                        sqlBulkCopy.ColumnMappings.Add("INFRA_PROVIDER", "INFRA_PROVIDER");
                        sqlBulkCopy.ColumnMappings.Add("IP_COLO_SITEID", "IP_COLO_SITEID");
                        sqlBulkCopy.ColumnMappings.Add("VENDOR_CODE", "VENDOR_CODE");
                        sqlBulkCopy.ColumnMappings.Add("MW_INSTALLED", "MW_INSTALLED");
                        sqlBulkCopy.ColumnMappings.Add("DG_NONDG", "DG_NONDG");
                        sqlBulkCopy.ColumnMappings.Add("EB_NONEB", "EB_NONEB");
                        sqlBulkCopy.ColumnMappings.Add("TOWER_TYPE", "TOWER_TYPE");
                        sqlBulkCopy.ColumnMappings.Add("ID_OD_COUNTCHANGE", "ID_OD_COUNTCHANGE");
                        sqlBulkCopy.ColumnMappings.Add("ID_OD_CHANGEDDATE", "ID_OD_CHANGEDDATE");
                        sqlBulkCopy.ColumnMappings.Add("RRH_COUNTCHANGE", "RRH_COUNTCHANGE");
                        sqlBulkCopy.ColumnMappings.Add("IP_COLO_SITEID", "IP_COLO_SITEID");
                        sqlBulkCopy.ColumnMappings.Add("RRH_CHANGEDDATE", "RRH_CHANGEDDATE");
                        sqlBulkCopy.ColumnMappings.Add("EB_NONEB", "EB_NONEB");
                        sqlBulkCopy.ColumnMappings.Add("TENANCY_COUNTCHANGE", "TENANCY_COUNTCHANGE");
                        sqlBulkCopy.ColumnMappings.Add("TENANCY_CHANGEDDATE", "TENANCY_CHANGEDDATE");

                        sqlBulkCopy.WriteToServer(dt);
                        con.Close();
                    }
                }
            }
        }

注意:除此之外,我还有几列我不想插入数据。请提出问题所在

【问题讨论】:

标签: c# asp.net oracle gridview datatable


【解决方案1】:

您可以使用数组绑定来代替 BulkCopy:

        using (OracleConnection oracleConnection = new OracleConnection("Data Source=...."))
        {
            string query = @"INSERT INTO mytable (COL1, COL2) VALUES (:col1, :col2)";

            oracleConnection.Open();

            using (var command = oracleConnection.CreateCommand())
            {
                command.CommandText = query;
                command.CommandType = CommandType.Text;
                command.BindByName = true;
                command.ArrayBindCount = dt.Rows.Count;

                command.Parameters.Add(":col1", OracleDbType.Int32, dt.AsEnumerable().Select(r => r.Field<Int32>("col1")).ToArray(), ParameterDirection.Input);
                command.Parameters.Add(":col2", OracleDbType.Date, dt.AsEnumerable().Select(r => r.Field<DateTime>("col2")).ToArray(), ParameterDirection.Input);

                int result = command.ExecuteNonQuery();
            }
        }

【讨论】:

  • 是一次插入一行还是多行?
  • 这里的out参数在哪里??
  • 它将一个孔列绑定为一个数组,所以是的,它一次用于多行。你的“输出参数”是什么意思?
  • 它的工作人员,只有一个问题。当日期为空时,它会给我错误
  • 哪个错误?如果您的空白日期字段包含 DBNull.Value,您只需使用可为空的类型:r.Field&lt;DateTime?&gt;("col2")).ToArray()