» »

c# - mssql kombinacija / problem pri zapisu row-a v bazo

c# - mssql kombinacija / problem pri zapisu row-a v bazo

KernelPanic ::

Spostovani!

Imam sledec problem:
Imam tabelo z 110 fieldi, katere zgolj namen je hranjenje log zapisa dogodkov v napravi, iz katere podatke (teh 110 podatkov) berem. Opravka imam z tremi tipi podatkov:
- string
- double
- float
Iz naprave preberem vse podatke pravilno in ko hocem shraniti z TableAdapter.Update, se vsi podatki pravilno zapisejo v bazo, razen podatkov tipa float. Mi lahko podate kaksne nasvete, kaj bi bilo lahko narobe. Tabelo v bazi, ki sem jo skreiral, sem pregledal po dolgem in pocez in ni napak (vsaj mislim tako :D). Tip string sem mapiral v nchar[255], tip double sem mapiral v float(53) in tip float sem mapiral v tip real, vendar podatki tipa float se vedno niso zapisani v bazi. Kaj bi bilo lahko narobe?

Vnaprej se vam zahvaljujem za vaso pomoc in s spostovanjem,
M.

KernelPanic ::

Nihce ne ve nicesar??? :8)

win64 ::

KernelPanic je izjavil:

Nihce ne ve nicesar??? :8)

prilepi primer loga

KernelPanic ::

Hmm, kaksnega loga?

win64 ::

kar prebereš iz naprave

KernelPanic ::

podatki, ki jih preberem iz naprave, so tocni, tudi ko naredim float iz 4ih bajtov, je vse ok, saj je dobljena vrednost 15.0 (stopinj) enaka izmerjeni temperaturi sonde, iz katere preko te naprave berem temperaturo. Nikakor pa tega podatka (float fAverageTemperature=15.0;) ne morem zapisati niti v float(1) stolpec, niti v float(53) stolpec in niti v real stolpec, vedno je vrednost NULL, ko odprem tabelo v MS SQL Server Management Console. Kaj bi bilo lahko narobe, pocasi obupujem, ker jutri zjutraj to mora delati ...

dolenc ::

Prilepi še kako sestaviš komando, ki jo uporabiš, mogoče si pa tip podatka pri parametru napačno nastavil(tist DbType).

KernelPanic ::

Koda je tukaj, ker je veliko podatkov, je funkcija ogromna, bom pa izpisal naprimer samo tiste tipe, ki ne delajo:
        private void addTransactionToDatabase(int iTransactionId)
        {
            const int iBufferInSize = 0;    // initial input buffer size
            bool bOk = false;   // operation success flag
            short[] bufferIn = new short[iBufferInSize];
            DataRow drTargetRow;    // db datarow
            short[] floatNumberToConvert = new short[2]; // for reading float values
            short[] doubleNumberToConvert = new short[4];   // for reading double values

            bOk = this.m_CoreFunctions[0].readTransactionLog(iTransactionId,
                ref bufferIn);

            drTargetRow = this.m_datasetPinus.ACCULOAD_TRANSACTIONS.NewRow();

            // **** FIELDS SETUP
            drTargetRow[AccuLoadIIIMonitor.TransactionTable.
                FieldNames.FIELD_TR_ID] = iTransactionId;

            // **** NUMBER OF BATCHES DELIVERED COMPOSITION
            drTargetRow[AccuLoadIIIMonitor.TransactionTable.
                FieldNames.FIELD_NR_BATCHES_DELIVERED] = bufferIn[1];
            // **** END OF NUMBER OF BATCHES DELIVERED COMPOSITION

            // **** TIMESTAMP COMPOSITION
            DateTime dtTransactionTimeStamp = new DateTime(bufferIn[2],
                bufferIn[3],
                bufferIn[4],
                0,
                bufferIn[8],
                bufferIn[7],
                bufferIn[6],
                0);
            drTargetRow[AccuLoadIIIMonitor.TransactionTable.
                FieldNames.FIELD_TR_TIME_STAMP] = dtTransactionTimeStamp;
            // **** END OF TIMESTAMP COMPOSITION

            // **** PROMPT RESPOSNES COMPOSITION
            // TODO: add msbs
            drTargetRow[AccuLoadIIIMonitor.TransactionTable.FieldNames.
                FIELD_PR_RESPONSE1] = bufferIn[10];
            drTargetRow[AccuLoadIIIMonitor.TransactionTable.FieldNames.
                FIELD_PR_RESPONSE2] = bufferIn[12];
            drTargetRow[AccuLoadIIIMonitor.TransactionTable.FieldNames.
                FIELD_PR_RESPONSE3] = bufferIn[14];
            drTargetRow[AccuLoadIIIMonitor.TransactionTable.FieldNames.
                FIELD_PR_RESPONSE4] = bufferIn[16];
            drTargetRow[AccuLoadIIIMonitor.TransactionTable.FieldNames.
                FIELD_PR_RESPONSE5] = bufferIn[18];
            // **** END OF PROMPT RESPOSNES COMPOSITION

            // **** TRANSACTION ALARMS COMPOSITION
            drTargetRow[AccuLoadIIIMonitor.TransactionTable.FieldNames.
                FIELD_TR_NUMBER_OF_ALARMS] = bufferIn[20];
            // **** END OF TRANSACTION ALARMS COMPOSITION

            // **** AVERAGE METER FACTOR COMPOSITION
            floatNumberToConvert[0]=bufferIn[122];
            floatNumberToConvert[1]=bufferIn[121];

            drTargetRow[AccuLoadIIIMonitor.TransactionTable.FieldNames.
                FIELD_TR_AVERAGE_METER_FACTOR] = this.m_CoreFunctions[0].composeFloat(floatNumberToConvert);
            // **** END OF AVERAGE METER FACTOR COMPOSITION

            // **** AVERAGE TEMPERATURE COMPOSITION
            floatNumberToConvert[0] = bufferIn[124];
            floatNumberToConvert[1] = bufferIn[123];
            //System.Single fAverageTemperature = this.m_CoreFunctions[0].composeFloat(floatNumberToConvert);

            drTargetRow[AccuLoadIIIMonitor.TransactionTable.FieldNames.
                FIELD_TR_AVERAGE_TEMPERATURE] = this.m_CoreFunctions[0].composeFloat(floatNumberToConvert);/*fAverageTemperature;*/
            // **** END OF AVERAGE TEMEPRATURE COMPOSITION

            // **** AVERAGE DENSITY COMPOSITION
            floatNumberToConvert[0] = bufferIn[126];
            floatNumberToConvert[1] = bufferIn[125];

            drTargetRow[AccuLoadIIIMonitor.TransactionTable.FieldNames.
                FIELD_TR_AVERAGE_DENSITY] = this.m_CoreFunctions[0].composeFloat(floatNumberToConvert);
            // **** END OF AVERAGE DENSITY COMPOSITION

            // **** AVERAGE PRESSURE COMPOSITION
            floatNumberToConvert[0] = bufferIn[128];
            floatNumberToConvert[1] = bufferIn[127];

            drTargetRow[AccuLoadIIIMonitor.TransactionTable.FieldNames.
                FIELD_TR_AVERAGE_PRESSURE] = this.m_CoreFunctions[0].composeFloat(floatNumberToConvert);
            // **** END OF AVERAGE PRESSURE COMPOSITION

            // **** AVERAGE CTL COMPOSITION
            floatNumberToConvert[0] = bufferIn[130];
            floatNumberToConvert[1] = bufferIn[129];

            drTargetRow[AccuLoadIIIMonitor.TransactionTable.FieldNames.
                FIELD_TR_AVERAGE_CTL] = this.m_CoreFunctions[0].composeFloat(floatNumberToConvert);
            // **** END OF AVERAGE CTL COMPOSITION

            // **** AVERAGE CPL COMPOSITION
            floatNumberToConvert[0] = bufferIn[132];
            floatNumberToConvert[1] = bufferIn[131];

            drTargetRow[AccuLoadIIIMonitor.TransactionTable.FieldNames.
                FIELD_TR_AVERAGE_CPL] = this.m_CoreFunctions[0].composeFloat(floatNumberToConvert);
            // **** END OF AVERAGE CPL COMPOSITION

            // **** TRANSACTION ADDITIVE 1 VOLUME COMPOSITION
            doubleNumberToConvert[0] = 136;
            doubleNumberToConvert[1] = 135;
            doubleNumberToConvert[2] = 134;
            doubleNumberToConvert[3] = 133;

            drTargetRow[AccuLoadIIIMonitor.TransactionTable.FieldNames.
                FIELD_TR_ADDITIVE1_VOLUME] = this.m_CoreFunctions[0].composeDouble(doubleNumberToConvert);
            // **** END OF TRANSACTION ADDITIVE 1 VOLUME COMPOSITION
            // **** END OF FIELDS SETUP

            this.m_datasetPinus.ACCULOAD_TRANSACTIONS.Rows.Add(drTargetRow);    // adds created row into table
            int iSuccess = this.m_taPinus.Update(this.m_datasetPinus); // updates table adapter
        }   // addTransactionToDatabase
Torej, v zgornji kodi se v bazo pravilno zapisejo podatki tipa string in podatki tipa double. Zakaj float ne?

KernelPanic ::

Ok, zbrisal sem dataset in ga postavil na novo in sedaj mi zapisuje vrednosti (WTF?!) brez problemov. Se vedno pa ostaja sledec problem: V tabeli imam 1 zapis (row), kar nonstop preverjam z mssql server managamenet studio, vendar mi v zgornji funkciji vrstica:
            try
            {
                //iNumberOfRows = this.m_datasetPinus.ACCULOAD_STATUS.Count();
                drTargetRow = this.m_datasetPinus.ACCULOAD_STATUS.Rows[0];  // get first record
            }
            catch (IndexOutOfRangeException ex)
            {
                // table is empty
se vedno mece exception, kot da je tabela prazna. V cem je fora???

KernelPanic ::

Sedaj sem na mssql serverju vtipkal query, ki vraca stevilo recordov v tabeli in dobim mi vrne vrednost 1, tako, kot mora:
SELECT COUNT(*) FROM dbo.ACCULOAD_STATUS;

Mitja Bonča ::

Za predzadnji post: če ti meče ven error, to pomeni da tabela nima zapisov, v tabeli ni nobene vrstice z podatki, ker če bi bili, bi ta koda morala delati:
Primer:
            DataSet ds = new DataSet();
            DataTable table = new DataTable("myTable");
            ds.Tables.Add(table);
            table.Columns.Add("column1", typeof(int));
            table.Columns.Add("column2", typeof(string));

            table.Rows.Add(1, "item 1");

            DataRow rows = ds.Tables["myTable"].Rows[0];

Ta koda deluje 100%.
-------------------------------------
Zadnj post:
"Get row count from SqlCommand" deluje, stavek je pravilen. Tako da bi dataTable (oz. DataSet določene tabele).

Ker imaš neka svoja imena, nevem točno kaj je DataSet in kaj je DataTable (default imena), zato preveri svojo kodo, če imaš tako kot jaz.

KernelPanic ::

Mitja Bonča je izjavil:

Za predzadnji post: če ti meče ven error, to pomeni da tabela nima zapisov, v tabeli ni nobene vrstice z podatki, ker če bi bili, bi ta koda morala delati:
Primer:

DataSet ds = new DataSet();
DataTable table = new DataTable("myTable");
ds.Tables.Add(table);
table.Columns.Add("column1", typeof(int));
table.Columns.Add("column2", typeof(string));

table.Rows.Add(1, "item 1");

DataRow rows = ds.Tables["myTable"].Rows[0];

Ta koda deluje 100%.
-------------------------------------
Zadnj post:
"Get row count from SqlCommand" deluje, stavek je pravilen. Tako da bi dataTable (oz. DataSet določene tabele).

Ker imaš neka svoja imena, nevem točno kaj je DataSet in kaj je DataTable (default imena), zato preveri svojo kodo, če imaš tako kot jaz.

Lej, problem je, da v mssql serverju v tabeli JE EN ZAPIS, v kodi mi pa vztrajno kaze, da je tabela prazna in ne vem vec, kaj naj storim!!!

darkolord ::

Če nekaj zapišeš v bazo in takoj za tem (brez ugašanja program) v kodi preveriš, če je kaj v tabeli, ti še zmeraj kaže, da je prazno?


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[c#] Vprasanje glede eventov

Oddelek: Programiranje
101364 (1078) Looooooka
»

DataView, DataTable, DataSet

Oddelek: Programiranje
91140 (891) detroit
»

[C#] ne dodaja podatkov v bazo

Oddelek: Programiranje
91565 (1414) alesp56
»

razložitev nekaterij elementov v visual studio 05

Oddelek: Programiranje
72081 (1886) darkolord
»

[ C ] floating point not loaded !!?

Oddelek: Programiranje
111518 (1451) Fizikalko

Več podobnih tem