ADO.NET - update z nie pustych textBox'ów

0

ADO.NET - update z <ort>nie pustych</ort> textBox'ów

Witam

Aktualizuje dane w bazie (SQL Server EE) przy pomocy np.
UPDATE JakasBaza SET Coś1=@Parametr1, Coś2=Parametr2 WHERE id=@ParametrId

parametry pobieram z textBoxów.

Jednym przyciskiem chce aktualizować wprowadzone wartości z textBoxów do Bazy, z tym że jeżeli nie wprowadzę jakiejkolwiek wartości do danego textBoxa to zaktualizuje mi baze z pustą wartością, a tego nie chce, jak to ominąć ?

Czyli jeżeli textBox jest pusty to nie aktualizuje mi o pusta wartość tylko w bazie pozostaje poprzednia ?

Jedyne rozwiązanie jakie przychodzi mi do głowy to zrobić tyle poleceń UPDATE ile jest parametrów i sprawdzać czy textBox jest pusty, jezeli nie to polecenie sie wykonuje ale to niezbyt poprawne rozwiązanie dlatego proszę o sugestię jak to zrobić najprościej ;-)

pozdro

0
damdi napisał(a)

zrobić tyle poleceń UPDATE ile jest parametrów
Tego nie rób, jedno polecenie wystarczy.

damdi napisał(a)

sprawdzać czy textBox jest pusty
no to raczej oczywiste jest. Jeśli którykolwiek jest pusty to nie wykonujesz polecenia.

0

ok tylko chodzi o to, zeby zaktualizowal wszystkie te, które nie są puste, bo bez sensu jak formularz bedzie mial 20 textBoxów bede chcial zaktualizować 1 komórke w 1 rekordzie i musze uzupełnić wszystkie 20 :) Jakies sugestie ?

Myślałem o tym, żeby do pustch textBoxów wczytywały się wartości aktualnie istniejące w bazie, tylko nie wiem jak to zrobic zeby bylo ok

0

To sklej zapytanie z niepustych TextBox'ów, mniej więcej tak:

TextBox[] boxy = { textBoxNazwa, textBoxIlosc, textBoxWielkosc };
string[] kolumny = { "nazwa", "ilosc", "wielkosc" };
OleDbCommand command = OleDbCommand.Create(...);
StringBuilder query = StringBuilder.Create("UPDATE Costam SET ");

for(int i = 0; i < 3; i++)
{
   if(boxy[i].Text.Length > 0) 
   {
      query.AppendFormat("{0}=@{0},", kolumny[i]);
      command.Parameters.AddWithValue('@' + kolumny[i], boxy[i].Text);
   }
}
if(query.Length > 0)
{
   query.Length--; //usuwamy ostatni przecinek
   query.AppendFormat(" WHERE costam");
   command.CommandText = query.ToString();
   command.ExecuteNonQuery();
}
0

Przykład:

ALTER PROCEDURE [dbo].[spSetArticle]
(
      @ArticleId int ,
      @ParentId int = null,
      @TemplateId smallint = null,
      @SiteId smallint = null,
      @Name varchar(256) = null,
      @Url varchar(256) = null,
      @Created smalldatetime = null,
      @Guid uniqueidentifier = null,
      @Deleted bit = null,
      @ShowInMenu bit = null,
      @PublishStart smalldatetime = null,
      @PublishEnd smalldatetime = null,
      @Published bit = null,
      @SortOrder smallint = null
)
AS
BEGIN
SET NOCOUNT ON

Update tblArticle set ParentId= ISNULL(@ParentId,ParentId),
TemplateId= ISNULL(@TemplateId,TemplateId),
 SiteId= ISNULL(@SiteId,SiteId),
 [Name]= ISNULL(@Name,[Name]),
 Url= ISNULL(@Url,Url),
 Created= ISNULL(@Created,Created),
 Guid= ISNULL(@Guid,Guid),
 Deleted= ISNULL(@Deleted,Deleted),
 ShowInMenu= ISNULL(@ShowInMenu,ShowInMenu),
 PublishStart= ISNULL(@PublishStart,PublishStart), PublishEnd= ISNULL(@PublishEnd,PublishEnd), Published= ISNULL(@Published,Published),
 Sortorder= ISNULL(@SortOrder,Sortorder)
 where [Id] = @ArticleId

Podaj tylko te, które zmieniasz i zadziała.

0

Procedura na bazie nie jest głupia, aczkolwiek jeśli mówisz o ADO wykorzystaj możliwości jakie daje Ci DataSet i BindingSource, aktualizuj co Ci trzeba i wykonuj polecenia przez Adapter danych on sie wszystkim zajmie ;)

0

Procedura na bazie faktycznie działa :)

si3ma, czy mógłbyś rozwinąć szczegółowo jak to zrobić ? Najlepiej na analogicznym przykładzie do mojego problemu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1