Нужно ли выполнять заливку перед обновлением в ADO.NET? - PullRequest
0 голосов
/ 10 сентября 2011

Это может показаться тривиальным, но каждый пример ADO.net, который я когда-либо видел, почти всегда имеет «заливку» перед «обновлением».Мы действительно не хотим заполнять набор данных, который может иметь тысячи пятен, мы просто хотим добавить (вставить) в таблицу.Требуется ли заполнение для обновления? В качестве примера приведен пример кода с веб-сайта MSFT (мы делаем нечто подобное):

SqlConnection con = new SqlConnection("Server=Darkover;uid=<username>;pwd=<strong            password>;database=northwind");
SqlDataAdapter da = new SqlDataAdapter("Select * From MyImages", con);
SqlCommandBuilder MyCB = new SqlCommandBuilder(da); // What does this even do?
DataSet ds = new DataSet("MyImages");

da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
FileStream fs = new FileStream(@"C:\winnt\Gone Fishing.BMP", FileMode.OpenOrCreate, FileAccess.Read);

byte[] MyData= new byte[fs.Length];
fs.Read(MyData, 0, System.Convert.ToInt32(fs.Length));

fs.Close();

da.Fill(ds,"MyImages");  // are they really filling a dataset with all those images???

DataRow myRow;
myRow=ds.Tables["MyImages"].NewRow();

myRow["Description"] = "This would be description text";
myRow["imgField"] = MyData;
ds.Tables["MyImages"].Rows.Add(myRow);
da.Update(ds, "MyImages");

con.Close();

1 Ответ

0 голосов
/ 10 сентября 2011

Вы хотите вызвать da.Fill(), чтобы получить схему для таблицы MyImages.Таким образом, вы можете использовать DataRow, возвращаемый при вызове NewRow() с правильной схемой (столбцы, ключи и т. Д.) При назначении значений для столбцов.

Вы можете указать SqlDataAdapter, что нужно вернутьтолько схему без данных, указав SqlDataAdapter.FillCommandBehavior:

da.FillCommandBehavior = CommandBehavior.SchemaOnly;
da.Fill(ds,"MyImages"); // Just get the schema for MyImages

DataRow myRow = ds.Tables["MyImages"].NewRow();
myRow["Description"] = "This would be description text";
myRow["imgField"] = MyData;
ds.Tables["MyImages"].Rows.Add(myRow);

da.Update(ds, "MyImages");

Вы также можете использовать da.FillSchema() с одним DataTable или DataSet, если ваш запрос возвращает несколько таблиц.

DataTable dt = new DataTable();

da.FillSchema(dt, SchemaType.Mapped);

DataRow myRow = dt.NewRow();
myRow["Description"] = "This would be description text";
myRow["imgField"] = MyData;
dt.Rows.Add(myRow);

da.Update(dt);
...