TableAdapter Join table ไม่สามารถ Update ได้ ต้องทำอย่างไรหรอครับ
เราต้องสร้าง Store Insert,Update,Delete เองอ่าครับ แล้วก็ config TableAdapter Add Method แล้วเลือก Store พวกนี้ เพิ่มเข้าไป แล้วปกติผมจะสร้าง Class DataObject ครอบ Table Adapter อีกที่ ยกตัวอย่างเช่น
Class Diagram
=======================
MyTableAdapter
=======================
ColumA (PK)
ColumB
ColumC
=======================
Fill()
GetAll()
GetById(int Id)
Insert(ColumnA,ColumnB,ColumnC)
Update(ColumnA,ColumnB,ColumnC)
Delete(ColumnA,ColumnB,ColumnC)
=======================
Code
[System.ComponentModel.DataObject]
public class PuchaseDataObject
{
private MyTableAdapter m_Adapter;
public MyTableAdapter Adapter
{
get {
if (m_Adapter==null)
{
m_Adapter = new MyTableAdapter();
}
return m_Adapter;
}
}
public MyDataSet.MyTable GetAll()
{
return Adapter.GetAll();
}
public MyDataSet.MyRow GetById(int Id)
{
return Adapter.GetById(Id);
}
public void Insert(MyDataSet.MyRow row)
{
Adapter.Insert(row.ColumnA,row.ColumnB,row.ColumnC);
}
public void Update(MyDataSet.MyRow row)
{
Adapter.Update(row.ColumnA,row.ColumnB,row.ColumnC);
}
public void Delete(MyDataSet.MyRow row)
{
Adapter.Delete(row.ColumnA);
}
}
Date :
2009-05-19 10:23:48
By :
jezusmitsui
ขอบคุณครับ
อันนี้คือใช้ ClassDiagram เจน แล้วเขียน class PuchaseDataObject มาใช้อีกทีหรอครับ
ผมเคยใช้ ClassDiagram เจนแล้ว แต่ผมใช้งานผ่านพวก เมธอด Get Set ไม่ถูก แล้วผมใช้ ObjectDataSource แล้วมองไม่เห็นคลาสที่เจนมา
ผมใช้วิธีสร้างเมธอด เขียนติดต่อฐานข้อมูลเสร็จเก็บใส่ da ds
ผมเลยเปลี่ยนมาสร้าง dataset.xsd แทน เพราะมันติดต่อดาต้าเบส ให้เลย แล้วผมใช้ ObjectDataSource เห็น
1.ถ้าใ ช้ dataset.xsd สามารถทำได้ไหมครับ
2.ถ้าใช้ ClassDiagram พอจะมีตัวอย่าง ที่เขียนติดต่อดาต้าเบส แล้ววิธีเรียกใช้งานไหมคับ เพราะผมทำแล้ว ObjectDataSource มองไม่เห็นคลาส
ขอบคุณมากครับ
Date :
2009-05-19 13:21:08
By :
hassadin
ขอบคุณครับ
Date :
2009-05-19 19:29:10
By :
hassadin
ตรง [System.ComponentModel.DataObjectMethodType(DataObjectMethodType.Insert,true)]
ใช่ [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select,true)] หรือป่าวครับ
Date :
2009-05-20 00:06:33
By :
hassadin
อันนี้ดูเป็นตัวอย่างได้ครับ เผื่อคนที่ทำไม่เป็นเหมือนผมครับ
http://greatfriends.biz/webboards/msg.asp?id=98238
Date :
2009-05-20 00:47:44
By :
hassadin
ผมทำ แบบลิ้งค์ข้างบนอ่ะครับ ตารางเดียวใช้ได้ แต่ สองตาราง join กันไม่ได้เหมือนครับ - -
รูปภาพ
DetailRepair.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using WebApplication2.DataSet2TableAdapters;
namespace WebApplication2
{
[System.ComponentModel.DataObject]
public class DetailRepair
{
public DetailRepair()
{
}
private DetailRepairTableAdapter _detailRepairAdapter;
public DetailRepairTableAdapter Adapter
{
get
{
if (_detailRepairAdapter == null)
{
_detailRepairAdapter = new DetailRepairTableAdapter();
}
return _detailRepairAdapter;
}
}
[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, true)]
public DataSet2.DetailRepairDataTable GetAll(string Repair_id,int? listRepair_no)
{
return Adapter.GetDataDetailById(Repair_id,listRepair_no);
}
[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update, true)]
public bool UpdateDetailRepair(string Repair_id,string listrepair_status,int? listRepair_no,string technician_name,string listRepair_date_start,string listRepair_date_end,string listRepair_about,string listRepair_comment)
{
DataSet2.DetailRepairDataTable dtReps = Adapter.GetDataDetailById(Repair_id,listRepair_no);
if (dtReps.Count == 0)
{
return false;
}
DataSet2.DetailRepairRow rep = dtReps[0];
if (listrepair_status == null)
{
rep.SetlistRepair_statusNull();
}
else
{
rep.listRepair_status = listrepair_status;
}
if (technician_name == null)
{
rep.Settechnician_nameNull();
}
else
{
rep.technician_name = technician_name ;
}
if (listRepair_date_start == null)
{
rep.SetlistRepair_date_startNull();
}
else
{
rep.listRepair_date_start = listRepair_date_start;
}
if (listRepair_date_end == null)
{
rep.SetlistRepair_date_endNull();
}
else
{
rep.listRepair_date_end = listRepair_date_end;
}
if (listRepair_about == null)
{
rep.SetlistRepair_aboutNull();
}
else
{
rep.listRepair_about = listRepair_about;
}
if (listRepair_comment == null)
{
rep.SetlistRepair_commentNull();
}
else
{
rep.listRepair_comment = listRepair_comment;
}
int rowsAffected = Adapter.Update(rep);
return (rowsAffected==1);
}
public void Update(DataSet2.DetailRepairRow row)<<<<< อันนี้ผมลอง สร้าง method update ตามตัวอย่างพี่ครับ
{
Adapter.Update(row.listRepair_status, row.listRepair_date_start, row.listRepair_date_end,row.listRepair_about,row.listRepair_comment);
}
}
}
Test.aspx
<%
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataSourceID="ObjectDataSource1">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField DataField="Teacher_name" HeaderText="Teacher_name"
SortExpression="Teacher_name" />
<asp:BoundField DataField="Repair_date_start" HeaderText="Repair_date_start"
SortExpression="Repair_date_start" />
<asp:BoundField DataField="listRepair_no" HeaderText="listRepair_no"
SortExpression="listRepair_no" />
<asp:BoundField DataField="Computer_name" HeaderText="Computer_name"
SortExpression="Computer_name" />
<asp:BoundField DataField="listRepair_problem" HeaderText="listRepair_problem"
SortExpression="listRepair_problem" />
<asp:BoundField DataField="listRepair_room" HeaderText="listRepair_room"
SortExpression="listRepair_room" />
<asp:BoundField DataField="listRepair_status" HeaderText="listRepair_status"
SortExpression="listRepair_status" />
<asp:BoundField DataField="technician_name" HeaderText="technician_name"
SortExpression="technician_name" />
<asp:BoundField DataField="listRepair_id" HeaderText="listRepair_id"
SortExpression="listRepair_id" />
<asp:BoundField DataField="listRepair_date_start"
HeaderText="listRepair_date_start" SortExpression="listRepair_date_start" />
<asp:BoundField DataField="listRepair_date_end"
HeaderText="listRepair_date_end" SortExpression="listRepair_date_end" />
<asp:BoundField DataField="listRepair_about" HeaderText="listRepair_about"
SortExpression="listRepair_about" />
<asp:BoundField DataField="listRepair_comment" HeaderText="listRepair_comment"
SortExpression="listRepair_comment" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
OldValuesParameterFormatString="{0}" SelectMethod="GetAll"
TypeName="WebApplication2.DetailRepair" UpdateMethod="UpdateDetailRepair">
<UpdateParameters>
<asp:Parameter Name="listrepair_id" Type="String" />
<asp:Parameter Name="listrepair_status" Type="String" />
<asp:Parameter Name="listrepair_no" Type="Int32" />
<asp:Parameter Name="technician_name" Type="String" />
<asp:Parameter Name="listRepair_date_start" Type="String" />
<asp:Parameter Name="listRepair_date_end" Type="String" />
<asp:Parameter Name="listRepair_about" Type="String" />
<asp:Parameter Name="listRepair_comment" Type="String" />
</UpdateParameters>
<SelectParameters>
<asp:QueryStringParameter DefaultValue="Repair_id" Name="Repair_id"
QueryStringField="Repair_id" Type="String" />
<asp:QueryStringParameter DefaultValue="listRepair_no" Name="listRepair_no"
QueryStringField="listRepair_no" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
%>
หลังจากที่ สร้าง เมธอด update มันให้คลิ๊ก เจอ เมธอด update ที่ไฟล์ DataSet2.Design.cs ครับ เลยคลิ๊กเจนไปครับ
รูปภาพ
พอใส่ข้อมูลแล้วกด Update ก็ Error แบบนี้ครับ
รูปภาพ
หาวิธี Update 2 table มาอาทิตย์กว่าแล้วครับ ทำไม่ได้สักที T-T
Date :
2009-05-20 02:16:02
By :
hassadin
เจี๊ยก คห ที่ 8 ที่หัว Code ผมพิมพ์ผิด T-T ต้องเป้น Update(เล่น Event Updating)
Date :
2009-05-20 11:00:31
By :
jezusmitsui
รบกวนช่วยต่ออีกนิดนะครับ ยังทำไม่ได้เลย ติดปัญหาเรื่องนี้มานานแล้วครับ
Code Behind
public void ObjectDataSource1_Updating(object sender, ObjectDataSourceMethodEventArgs e)
{
DataSet2.DetailRepairRow row = DataSet2.DetailRepairRow.NewDetailRepairRow();
//row.listRepair_id = e.InputParameters["listRepair_id"].ToString();
row.listRepair_status = e.InputParameters["listRepair_status"].ToString();
//row.listRepair_no = Convert.ToInt16(e.InputParameters["listRepair_no"]);
row.technician_name = e.InputParameters["technician_name"].ToString();
row.listRepair_date_start = e.InputParameters["listRepair_date_start"].ToString();
row.listRepair_date_end = e.InputParameters["listRepair_date_end"].ToString();
row.listRepair_about = e.InputParameters["listRepair_about"].ToString();
row.listRepair_comment = e.InputParameters["listRepair_comment"].ToString();
e.InputParameters["row"] = row;
//e.InputParameters.Remove["listRepair_id"];
//e.InputParameters.Remove["listRepair_status"];
//e.InputParameters.Remove["listRepair_no"];
}
1. ObjectDataSource1_Updating(object sender, ObjectDataSourceMethodEventArgs e)ใส่ไว้ใน Code Behind .aspx.cs ใช่ไหมครับ
2. แล้ว e.Input เฉพาะฟิวที่เราต้องการอัพเดท หรือป่าวครับ หรือว่าหมดเลย
3. ผมใส่ e.InputParemeters.Remove ไม่ได้ครับ
4. แล้ว ที่ ไฟล์ DetailRepair.cs ใช้ method update อันนี้ใช่ไหมครับ
DetailRepair.cs
public void Update(DataSet2.DetailRepairRow row)
{
Adapter.Update(row.listRepair_status,row.technician_name, row.listRepair_date_start, row.listRepair_date_end,row.listRepair_about,row.listRepair_comment);
}
5. แล้ว ที่ ไฟล์ .aspx ตรง ObjectDataSource ต้องใส่ OnUpdated หรือ OnUpdating ด้วยหรือป่าวครับ
ไม่ทราบว่าผมเข้าใจถูกหรือป่าว
แต่ผมลองทำแล้ว Error แบบนี้อ่ะครับ
No parameterless constructor defined for this object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.
ขอบคุณมากครับ
Date :
2009-05-20 23:53:57
By :
hassadin
รบกวน ผมทวนอีกทีและกันนะครับไม่แน่ใจว่าผมทำอะไรผิดถึงไม่ได้สักที
อันนี้ผม สร้างโปรเจ็คใหม่เลยนะครับ
ย้อนกลับไปดู No.8 ตรง DataSet2.DetailRepairRow row = DataSet2.DetailRepair .NewDetailRepairRow();
หรือว่า DetailRepairRow ครับ ผมเห็นมันไม่มีให้เลือกผมใส่ DetailRepairRow ไปนะครับ
แต่ว่า มันไม่มี .NewDetailRepairRow(); ให้เลือก ผมเลยใส่ไปเอง แล้วมันมีให้คลิ๊ก เลือก Gen อ่ะครับ (ถ้าไม่เจน มันก็ Error แดง)
ดังรูปนะครับ
จาก No.11
DataRow row = MyTableInstance.NewRow();
หรือ
DataRow row = MyTableInstance.AddMyRow(a,b,c);
หมายความว่า เปลี่ยนตรง DataSet2.DetailRepairRow row = DataSet2.DetailRepairRow.NewDetailRepairRow();
เป็น DataRow row = MyTableInstance
MyTableInstance ใช่ DataSet2.DetailRepairRow หรือ DataSet2.DetailRepairTable หรือป่าวครับ
แต่มันไม่มี .NewRow() หรือ .AddMyRow() ให้เลือกครับ
แล้วที่ไฟล์ DetailRepair.cs
เมธอด Update ที่สร้างขึ้นมา
ตรง Adapter.Update ขึ้น Error สีแดง มีให้คลิ๊ก gen ผมก็เลยคลิกเจนไปครับ
ดังรูป
ที่ .aspx
ตรง ObjectDataSource ผมแก้ DataObjectTypeName="" แ ละ OldValuesParameterFormatString="{0}" แล้วครับ
ทดสอบแล้ว update Error ดังรูป
ผมไม่รู้ว่า ผมทำผิดขึ้นตอนหรือเข้าใจผิดอะไรหรือป่าวครับ
ทำไม่ได้สักที
Date :
2009-05-21 17:21:34
By :
hassadin
ต้องรบกวนพี่อีกแล้ว ขอบคุณพี่มากนะครับ
โปรเจ็คผมไปไม่ถึงไหนติดอยู่ตรง Update นี่นานมากแล้วครับ
Date :
2009-05-21 17:24:39
By :
hassadin
ที่ ObjectDataSource ผมเพิ่ม OnUpdating="ObjectDataSource1_Updating" เข้าไปคิดว่าน่าจะใช่
แล้วก็ Error แบบนี้ครับ
The method or operation is not implemented.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NotImplementedException: The method or operation is not implemented.
Line 948: internal static DetailRepairRow NewDetailRepairRow()
Line 949: {
Line 950: throw new System.NotImplementedException();
Line 951: }
Line 952: }
ผมลองสร้าง method รับพารามิเตอร์ 12 ตัว ด้วยครับ ลองแล้ว Error เดียวกันครับ
Date :
2009-05-21 21:59:43
By :
hassadin
แก้ Code และส่งไปให้แล้วนะครับ
Date :
2009-05-22 11:02:23
By :
jezusmitsui
ขอบคุณครับ
Date :
2009-05-23 00:00:23
By :
hassadin
Load balance : Server 00