#asp.net-3.5
#asp.net-3.5
Вопрос:
Я хочу вставить данные из текстовых полей, используя ObjectDataSource. ObjectDataSource привязан к gridview, но отображает только определенные вычисляемые столбцы. Текстовые поля используются для ввода всех основных входных данных. Команды удаления и выбора ObjectDataSource (кнопки ссылок в gridview) работают. Однако у меня возникли проблемы с командой Insert. Я не могу понять, как передать данные из текстовых полей в качестве параметров для вставки ObjectDataSource
РЕДАКТИРОВАТЬ: с помощью приведенного ниже кода вставляется запись. Параметры передаются. odssMain.Insert() выдает ошибку: «Ссылка на объект не установлена для экземпляра объекта». РЕДАКТИРОВАТЬ: ПОЧЕМУ Я ПОЛУЧАЮ ЭТУ ОШИБКУ?
Кроме того, ObjectDataSource ведет себя странно. После ошибки я должен снова перенастроить метод вставки в мастере ODS, поскольку метод будет пустым.
ASP.NET 3.5 и SQL 2008, ПРОТИВ 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:
вы могли бы попробовать так….
ObjectDataSource для InsertParameter выглядит следующим образом
<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>
Я также передам свойство InsertMethod ObjectDataSource, которое будет иметь метод 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 получит текстовое значение текстового поля из строки нижнего колонтитула соответствующего столбца.
//Получить значение текстового поля строки нижнего колонтитула GridView
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;
}
}
и изображение результатов выглядит следующим образом …
Комментарии:
1. Да, я видел пример, похожий на этот.
2. Однако строка Customer. InsertParameters[«FirstName»] . defaultValue = strFirstName выдавало ошибку времени выполнения.