logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[visual c++] Wstawianie do bazy SQL 2005 zmiennej z textboxa

spanki 07 Gru 2011 13:24 2504 12
REKLAMA
  • #1 10229115
    spanki
    Poziom 10  
    Posty: 56
    Ocena: 6
    Witam Wszytskich,

    męczę się już od dłuższego czasu nad problemem wstawiania zmiennej z poziomu napisanego programu do bazy SQL 2005. Wykorzystuję ADO

    #import "C:\Program files\Common Files\System\Ado\msado15.dll" rename("EOF", "ADOEOF")

    Z bazą jestem połączony, potrafię tworzyc w niej nowe tabele, wpisywać dane na sztywno:

    recordset->Open(L"INSERT INTO zaklad (adres) VALUES ('Katowice')",connection.GetInterfacePtr(), ADODB::adOpenForwardOnly,ADODB::adLockReadOnly, ADODB::adCmdText);

    Wszystko ładnie się wpisuje w zdalnej bazie.
    Problem mam z jak nie na sztywno mieć przypisane wpisanie np. Katowice, tylko żeby wpisał to co jest wpisane w textbox.
    Próbowałem na wiele sposobów (zmienne itp;/), ale żaden nie działa.

    Proszę o radę, jak za pomocą ADO recordset wstawic dane z textboxa do bazy.

    pozdrawiam
  • REKLAMA
  • #2 10229650
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    A co stoi na przeszkodzie, żebyś skleił treść zapytania? Jeden string to "insert into" itd, a drugi to textbox->Text (w zasadzie trzy stringi, bo w trzecim będzie domknięcie za zawartością textboxa).
  • REKLAMA
  • #3 10232578
    spanki
    Poziom 10  
    Posty: 56
    Ocena: 6
    Witam,

    dzieki za rade. Przechwytuję dane z textboxa do stringa. Składam 3 stringi w jednego:

    String ^text= String::Concat(insert, dane, konc);

    mam teraz: text= "INSERT INTO zaklad (adres) VALUES ('Katowice')"

    Mam w stringu text treść zapytania. Teraz mam problem z wstawieniem stringa text zamiast zapytania do kodu:

    recordset->Open(L"INSERT INTO zaklad (adres) VALUES ('Katowice')",connection.GetInterfacePtr(), ADODB::adOpenForwardOnly,ADODB::adLockReadOnly, ADODB::adCmdText);

    Próbowałem na wiele sposobów, ale jakoś zawsze mam errora. :(
  • #4 10232659
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    Przepraszam, za lamerskie pytanie... ale do czego służy to 'L' w tym ciągu ?
    Cytat:
    recordset->Open(L"INSERT
  • REKLAMA
  • #5 10232668
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    Gdybyś jeszcze przedstawił te sposoby i błędy, jakie Ci się pojawiają...
    Pewnie coś nie gra z konwersją stringa .netowego na zwykły, C++owy.
    Zobacz, czy coś z tego http://msdn.microsoft.com/en-US/library/d1ae6tz5(v=VS.100).aspx będzie pomocne.
    A nawiasem mówiąc, w ustawieniach projektu dało się przełączyć character set z unicode na multi-byte, dzięki czemu nie trzeba pisać L przed stringami.

    arnoldziq -> "The L symbol in front of a string literal simply means that each character in the string will be stored as a wchar_t".
    http://stackoverflow.com/questions/1810343/is...l-starting-with-l-like-lhello-world-guarantee
  • #6 10232777
    spanki
    Poziom 10  
    Posty: 56
    Ocena: 6
    Witam,

    dziekuję za zainteresowanie. przekonwertowałem text string na wchar tak jak jest podane w przykładzie. Program mi sie kompiluje.
    Kod wczytania wygląda teraz następująco:

    recordset->Open(*text,connection.GetInterfacePtr(), ADODB::adOpenForwardOnly,ADODB::adLockReadOnly, ADODB::adCmdText);

    Mam podgląd text w label1 - po wczytaniu jest ok - składnia zgodna z SQL.
    Daje "wczytaj do bazy" i wyświetla mi błąd:

    An unhandled exception of type 'System.Runtime.InteropServices.SEHException' occurred in TEST 3.exe

    Additional information: Składnik zewnętrzny zgłosił wyjątek.



    Wydaje mi się, że teraz muszę coś zmienić z typem adCmdText gdyż teraz nie operuję na tekscie w "..." tylko na zmiennej *text.
  • #7 10232800
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    Mógłbyś podać trochę większy kawałek kodu, bo nie mam pojęcia, czym jest *text ani jak powstał ze stringa .NETowego.
    adCmdText pozostaje bez zmian - przecież to nieistotne, czy string jest podawany "żywcem", czy przez zmienną.
  • REKLAMA
  • #8 10232834
    spanki
    Poziom 10  
    Posty: 56
    Ocena: 6
    OK. Podaję kod jaki mieści się pod klawiszem "Wczytaj do bazy":

    String ^insert = "INSERT INTO zaklad (IDSAP) VALUES ('";
    String ^konc = "')";
    String ^dane = textBox1->Text;
    String ^s2= String::Concat(insert,dane ,konc);
    label1->Text=s2;
    //---------------- zamiana string na *wchar
    pin_ptr<const wchar_t> wch = PtrToStringChars(s2);
    printf_s("%S\n", wch);
    size_t convertedChars = 0;
    size_t sizeInBytes = ((s2->Length + 1) * 2);
    errno_t err = 0;
    char *text = (char *)malloc(sizeInBytes);
    //----------------

    HRESULT hr;
    CoInitialize(NULL);

    ADODB::_ConnectionPtr connection;
    hr = connection.CreateInstance(__uuidof(ADODB::Connection));
    if (FAILED(hr))
    {
    throw _com_error(hr);
    }
    ADODB::_RecordsetPtr recordset;
    hr = recordset.CreateInstance(__uuidof(ADODB::Recordset));
    if (FAILED(hr))
    {
    throw _com_error(hr);
    }


    //------polaczenie z baza
    connection->CursorLocation = ADODB::adUseClient;
    connection->Open(L"Provider=sqloledb;Data Source=KOMPZEW;"L"Initial Catalog=BAZADANYCH1;User Id=USER;Password=USERPAS1;", L"",L"", ADODB::adConnectUnspecified);
    //------------------


    //-------wczytanie
    recordset->Open(*text,connection.GetInterfacePtr(), ADODB::adOpenForwardOnly,ADODB::adLockReadOnly, ADODB::adCmdText);
    //-----------------


    Dodatkowo:

    #pragma once
    #include <iostream>
    #include <string>
    #include < stdio.h >
    #include < stdlib.h >
    #include < vcclr.h >
    #import "C:\Program files\Common Files\System\Ado\msado15.dll" rename("EOF", "ADOEOF")
    #using <mscorlib.dll>
    using namespace System;

    std::string outputashex(unsigned long l)
    {
    char buffer[1024];
    ::itoa(l, buffer, 16);
    return buffer;
    }


    Jestem już chyba blisko - ale dalej coś nie gra...
  • #9 10232866
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    Jak na mój gust, zamiast *text powinieneś przekazywać text - dawno w C++ nie pisałem, ale *text zwróci chyba tylko pierwszy znak, co jest oczywiście bez sensu.
  • #10 10232906
    spanki
    Poziom 10  
    Posty: 56
    Ocena: 6
    jak daję sam text bez * to po kompilacji pojawia mi się takie okienko jak w załączniku i program sie wysypuje.
    Załączniki:
    • [visual c++] Wstawianie do bazy SQL 2005 zmiennej z textboxa bez tytułu.JPG (17.57 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #11 10232936
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    Ha! A gdzie masz jakieś przypisanie do tego text? Widzę rezerwację pamięci, ale żadnego wpisania tekstu zapytania.
    Poza tym spróbuj przekazać wch - to jest wide char, więc może przejdzie.
  • #12 10233390
    spanki
    Poziom 10  
    Posty: 56
    Ocena: 6
    nie wrzucam tekstu do text??

    robię to w:

    String ^s2= String::Concat(insert,dane ,konc);

    Mam tekst w s2, nastepnie s2 konwertuje na zmienną text, która już jest wch. (??)
  • #13 10233410
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    Jak sam zauważyłeś, s2 ląduje w wch. I tyle. w char* text nie masz nic - tylko pamięć przydzielasz. Sprawdź sobie jeszcze raz przykład z mojego linku - tam dalej text jest wypełniany, a tego już nie masz.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik zmaga się z problemem wstawiania danych z textboxa do bazy SQL 2005 przy użyciu ADO w Visual C++. Po nawiązaniu połączenia z bazą i pomyślnym wstawieniu danych na sztywno, użytkownik chce dynamicznie wprowadzać dane z textboxa. W odpowiedziach zasugerowano łączenie stringów w celu utworzenia zapytania SQL oraz konwersję stringów .NET na wchar_t. Użytkownik napotkał problemy z błędami podczas wykonywania zapytania, co sugeruje problemy z konwersją typów oraz niewłaściwym przypisaniem zmiennych. Wskazówki obejmowały również sprawdzenie poprawności przypisania tekstu do zmiennej oraz użycie wide char.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA