ObjectDatasource传递参数

时间:2011-10-23 01:27:58

标签: asp.net-3.5

我想使用ObjectDatasource从文本框中插入数据。 ObjectDataSource绑定到gridview但仅显示某些计算列。文本框用于输入所有基本输入。 ObjectDatasource删除&选择命令(gridview上的链接按钮)正在运行。但是我在使用Insert命令时遇到问题。我无法弄清楚如何将文本框中的数据作为参数传递给ObjectDataSource Insert

编辑:使用下面的代码,插入一条记录。参数越过了。 odssMain.Insert()给出错误:“对象引用未设置为对象的实例”。 编辑:为什么我会犯这个错误?

此外,ObjectDataSource一直表现得很奇怪。发生错误后,我必须在ODS向导上再次重新配置插入方法,因为该方法将为空白。

ASP.NET 3.5& SQL 2008,VS 2008。

这是我的代码:

<asp:ObjectDataSource ID="odsMain" runat="server" 
    SelectMethod="SelectMain" DeleteMethod="DeleteMain" 
    InsertMethod="InsertMain" UpdateMethod="UpdateMain" 
    OldValuesParameterFormatString="original_{0}" TypeName="MainDB" >
.......
    <InsertParameters>
        <asp:Parameter Name="Quantity" Type="Int32" />
    </InsertParameters>
DAL FILE:
[DataObjectMethod(DataObjectMethodType.Insert)]
public static int InsertMain(int Quantity)/
{
    SqlConnection con = new SqlConnection(GetConnectionString());

    string strQuery = "INSERT INTO t_Main (Quantity) VALUES (@Quantity)";
    SqlCommand cmd = new SqlCommand(strQuery, con);
    cmd.Parameters.AddWithValue("@Quantity", Quantity);

    con.Open();
    int i = cmd.ExecuteNonQuery();
    con.Close();

    return i;
}

CODE BEHIND FILE:
protected void btnSaveAnalysis_Click(object sender, EventArgs e)
{
    odsMain.InsertParameters.Clear(); 

    //Store parameters with values to the collection
    odsMain.InsertParameters.Add(new Parameter ("Quantity", TypeCode.Int32, iQuantity.ToString()));

    //Diferent ways that I tried. Still not working
    //odsMain.InsertParameters.Add("Quantity", iQuantity.ToString());
    //odsMain.InsertParameters["Quantity"].DefaultValue = iQuantity.ToString();

    odsMain.Insert();

}

1 个答案:

答案 0 :(得分:2)

你可以尝试这样......

InsertParameter的ObjectDataSource如下所示

<InsertParameters>
 <asp:Parameter Name="FirstName" />  
 <asp:Parameter Name="MiddleName" /> 
 <asp:Parameter Name="LastName" />  
 <asp:Parameter Name="Desgination" />
 <asp:Parameter Name="Address" />  
 <asp:Parameter Name="City" />  
 <asp:Parameter Name="State" /> 
 <asp:Parameter Name="Country" /> 
</InsertParameters>

我还将传递ObjectDataSource的InsertMethod属性,该属性将具有InsertCustomer方法。

InsertCustomer方法如下所示: -

   public void InsertCustomer(string FirstName, string MiddleName,string LastName, string Desgination, string Address, string City, string State, string Country)  
   {  

    SqlConnection con = new SqlConnection(conStr);  
    SqlCommand cmd = new SqlCommand("InsertCustomer", con);  
    cmd.CommandType = CommandType.StoredProcedure;

//这个检查是必要的,当你没有传递任何值,因为它将传递为[默认]并将给出错误

    if (string.IsNullOrEmpty(FirstName))
       FirstName = string.Empty;  
    if (string.IsNullOrEmpty(LastName))  
        LastName = string.Empty;  
    if (string.IsNullOrEmpty(MiddleName))  
        MiddleName = string.Empty;  

    if (string.IsNullOrEmpty(Desgination)) 
        Desgination = string.Empty;  

    if (string.IsNullOrEmpty(Address))  
        Address = string.Empty;   

    if (string.IsNullOrEmpty(City))  
        City = string.Empty;  

    if (string.IsNullOrEmpty(State))  
        State = string.Empty;  

    if (string.IsNullOrEmpty(Country))  
        Country = string.Empty;  

    cmd.Parameters.AddWithValue("@IV_FirstName",  FirstName);  
    cmd.Parameters.AddWithValue("@IV_LastName", LastName);  
    cmd.Parameters.AddWithValue("@IV_MiddleName", MiddleName);  
    cmd.Parameters.AddWithValue("@IV_Desgination", Desgination);  
    cmd.Parameters.AddWithValue("@IV_Address", Address);  
    cmd.Parameters.AddWithValue("@IV_City", City);  
    cmd.Parameters.AddWithValue("@IV_State", State);  
    cmd.Parameters.AddWithValue("@IV_Country", Country);  
    using (con)  
    {  

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

    }  

  }

按钮保存以插入记录。

//插入记录保存按钮

protected void btnSave_Click(object sender, EventArgs e)  
{

     Customer.InsertParameters["FirstName"].DefaultValue = GetGridTextBoxValue("txtFirstName");  
    Customer.InsertParameters["MiddleName"].DefaultValue = GetGridTextBoxValue("txtMiddleName");  
    Customer.InsertParameters["LastName"].DefaultValue = GetGridTextBoxValue("txtLastName");  
    Customer.InsertParameters["Desgination"].DefaultValue= GetGridTextBoxValue("txtDesgination");  
    Customer.InsertParameters["Address"].DefaultValue = GetGridTextBoxValue("txtAddress");  
    Customer.InsertParameters["City"].DefaultValue = GetGridTextBoxValue("txtCity");  
    Customer.InsertParameters["State"].DefaultValue = GetGridTextBoxValue("txtState");  
    Customer.InsertParameters["Country"].DefaultValue = GetGridTextBoxValue("txtCountry");  
    Customer.Insert();  

 }  

GetGridTextBoxValue函数将从相应列的页脚行获取TextBox文本值。

//获取GridView Footer Row的TextBox值

public string GetGridTextBoxValue(string txtID)  
{
     try
    {
        TextBox txt = (TextBox)gvCustomer.FooterRow.FindControl(txtID); // here you can place any text box value on your design page 
        return txt.Text;  

    }

    catch (Exception ex)  
    {  
        return string.Empty;
        throw ex;  
    }  

}

结果图像enter image description here就是这样......