Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

spanki 07 Gru 2011 13:24 2060 12
  • #1 07 Gru 2011 13:24
    spanki
    Poziom 10  

    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

    0 12
  • #2 07 Gru 2011 16:11
    wiesniak
    Poziom 31  

    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).

    0
  • #3 08 Gru 2011 09:52
    spanki
    Poziom 10  

    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. :(

    0
  • #4 08 Gru 2011 10:27
    arnoldziq
    Moderator Programowanie

    Przepraszam, za lamerskie pytanie... ale do czego służy to 'L' w tym ciągu ?

    Cytat:
    recordset->Open(L"INSERT

    0
  • #5 08 Gru 2011 10:30
    wiesniak
    Poziom 31  

    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

    0
  • #6 08 Gru 2011 11:10
    spanki
    Poziom 10  

    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.

    0
  • #7 08 Gru 2011 11:16
    wiesniak
    Poziom 31  

    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ą.

    0
  • #8 08 Gru 2011 11:27
    spanki
    Poziom 10  

    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...

    0
  • #9 08 Gru 2011 11:34
    wiesniak
    Poziom 31  

    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.

    0
  • #11 08 Gru 2011 11:58
    wiesniak
    Poziom 31  

    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.

    0
  • #12 08 Gru 2011 14:11
    spanki
    Poziom 10  

    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. (??)

    0
  • #13 08 Gru 2011 14:18
    wiesniak
    Poziom 31  

    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.

    0