2013-06-20 2 views
0

Я пытаюсь создать конструктор, который будет заполнять данные из базы данных sqlite. Все, кажется, работает, когда я запускаю цикл for, который создает объекты и заполняет таблицу. Я получаю какой-то странный вывод. Я думаю, что это может иметь какое-то отношение к указателям на память, но я очень новичок в C++, и я не уверен, что я сделал не так.C++ Странный текст из SQLIte

Inventory Конструктор

Inventory::Inventory(int id) 
{ 
CC_Number cn; 
char result[100]; // array to hold the result. 
strcpy(result,"SELECT * FROM Inventory Where Inventory_ID = "); 
strcat(result,cn.int_to_char(id)); 
strcat(result,";"); 
db = new CC_Database("CC_Prepper_Inventory.sqlite"); 

vector<vector<string> > r = db->query(result); 
db->close(); 
for(vector<vector<string> >::iterator it = r.begin(); it < r.end(); ++it) 
{ 
    vector<string> row = *it; 
    CC_String cs; 
     setInv_ID(atoi(cs.toConChar(row.at(0)))); 
     Item item(atoi(cs.toConChar(row.at(1)))); 
     setItem(item); 
     setQnty(atof(cs.toConChar(row.at(2)))); 
     Location loc(atoi(cs.toConChar(row.at(3)))); 
     setLoc(loc); 
} 

} 

товара Конструктор

Item::Item(int id) 
{ 
CC_Number cn; 
char result[100]; // array to hold the result. 
strcpy(result,"SELECT * FROM Item Where Item_ID = "); 
strcat(result,cn.int_to_char(id)); 
strcat(result,";"); 
db = new CC_Database("CC_Prepper_Inventory.sqlite"); 

vector<vector<string> > r = db->query(result); 
db->close(); 
for(vector<vector<string> >::iterator it = r.begin(); it < r.end(); ++it) 
{ 
    vector<string> row = *it; 
    CC_String cs; 
     setItem_ID(atoi(cs.toConChar(row.at(0)))); 

     setCat_ID(atoi(cs.toConChar(row.at(1)))); 
     setItem_Name(cs.toConChar(row.at(2))); 
} 

} 

Расположение Constructor

Location::Location(int id) 
{ 
CC_Number cn; 
char result[100]; // array to hold the result. 
strcpy(result,"SELECT Loc_ID, Loc_Name FROM Location Where Loc_ID = "); 
strcat(result,cn.int_to_char(id)); 
strcat(result,";"); 
db = new CC_Database("CC_Prepper_Inventory.sqlite"); 

vector<vector<string> > r = db->query(result); 
db->close(); 
for(vector<vector<string> >::iterator it = r.begin(); it < r.end(); ++it) 
{ 
    vector<string> row = *it; 
    CC_String cs; 
     setLoc_ID(id); 
     setLoc_Name(cs.toConChar(row.at(1))); 
} 
} 

Категория Конструктор

Category::Category(int id) 
{ 
CC_Number cn; 
char result[100]; // array to hold the result. 
strcpy(result,"SELECT * FROM Category Where Cat_ID = "); 
strcat(result,cn.int_to_char(id)); 
strcat(result,";"); 
db = new CC_Database("CC_Prepper_Inventory.sqlite"); 

vector<vector<string> > r = db->query(result); 
db->close(); 
for(vector<vector<string> >::iterator it = r.begin(); it < r.end(); ++it) 
{ 
    vector<string> row = *it; 
    CC_String cs; 
     setCat_ID(id); 
     setCat_Name(cs.toConChar(row.at(1))); 
} 
} 

For Loop Используется для вызова Конструкторы

void MainWindow::fillTable() 
{ 
ui->mainTable->clear(); 
db = new CC_Database("CC_Prepper_Inventory.sqlite"); 
vector<vector<string> > result = db->query("SELECT Inventory_ID FROM Inventory;"); 
db->close(); 
ui->mainTable->setRowCount(result.size()); 
int j = 0; 
for(vector<vector<string> >::iterator it = result.begin(); it < result.end(); ++it) 
{ 
    vector<string> row = *it; 
    Inventory i(atoi(cs.toConChar(row.at(0)))); 

    cout << i.getItem().getItem_Name() << endl; 
    cout << i.getItem().getCategory().getCatName() << endl; 
    cout << cn.dbl_to_char(i.getQnty()) << endl; 
    cout << i.getLoc().getLocName() << endl; 

    QTableWidgetItem *newItem1 = new QTableWidgetItem(QString::fromStdString(i.getItem().getItem_Name())); 
    QTableWidgetItem *newItem2 = new QTableWidgetItem(QString::fromStdString(i.getItem().getCategory().getCatName())); 
    QTableWidgetItem *newItem3 = new  QTableWidgetItem(QString::fromStdString(cn.dbl_to_char(i.getQnty()))); 
    QTableWidgetItem *newItem4 = new  QTableWidgetItem(QString::fromStdString(i.getLoc().getLocName())); 
    ui->mainTable->setItem(j,1,newItem1); 
    ui->mainTable->setItem(j,2,newItem2); 
    ui->mainTable->setItem(j,3,newItem3); 
    ui->mainTable->setItem(j,4,newItem4); 
    i.clear(); 
    j++; 
} 

QStringList qsl; 
qsl << "Item" << "Category" << "Quantity" << "Location"; 
ui->mainTable->setHorizontalHeaderLabels(qsl); 
} 

Вот выход, когда я COUT результаты.

Food 
1 
B.O.L. 

Food 
3 
B.O.L. 

Food 
4 

0�an error 
Food 
3.14 
LE Item (
Item_ID INTEGER PRIMARY KEY AUTOINCREMENT, 
Cat_ID INTEGER NOT NULL, 
Item_Name TEXT NOT NULL)P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)� �� 

Food 
5  

Я знаю, что это информационная перегрузка, но я не знаю, как еще объяснить мой вопрос.

ответ

0

Я считаю, что проблема не в строках, которые вы опубликовали, а в других местах. Однако код призывает некоторые изменения:

  1. не использует символы массива для хранения запросов SQL, использование станд :: строка

  2. не открыть подключение к базе данных для каждого запроса .. . открыть его один раз и выполнить несколько запросов

+0

Я сузил функцию FillTable как и все печатает хорошо, пока я не использовать i.getItem(). getItem_Name() и i.getLoc(). getLocName () Все остальные функции работают нормально. Может быть, потому, что эти переменные являются const char * – Talon06

+0

Вот и я изменил их на строки, и теперь это работает. Я сделал их const char *, потому что мне постоянно приходилось преобразовывать строки, и это, казалось, спасло шаг. Теперь я знаю лучше. Спасибо, – Talon06