如何将数据库的数据读取到数组中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将数据库的数据读取到数组中相关的知识,希望对你有一定的参考价值。

如何将数据库的数据读取到数组中,我们做一个MFC程序,我负责的是把数据库的数据读取出来。读取到一个数组中,用ADO数据库方法,求求了 VC6.0环境下,在线等答案,急,马上就要交报告了,我是看了你的回答知道你是高手帮忙回答下

#ifdef WIN32
#include <windows.h>
#include <odbcinst.h>
#include <sqlext.h>
#else
#include <mysql.h>
#include <unistd.h>
#define SQLHANDLE static MYSQL
#endif
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

SQLHANDLE hDBEnv, hDBC;

int DB_Open(char * dbcn, char * usr, char * pwd)

int r;
#ifdef WIN32
r = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hDBEnv);
if(r) return 0;
r = SQLSetEnvAttr(hDBEnv,SQL_ATTR_ODBC_VERSION,
(void*)SQL_OV_ODBC3,0);
if(r) return 0;
r = SQLAllocHandle(SQL_HANDLE_DBC, hDBEnv, &hDBC);
if(r) return 0;
r = SQLConnect(hDBC,
(unsigned char *)dbcn, strlen(dbcn),
(unsigned char *)usr, strlen(usr),
(unsigned char *)pwd, strlen(pwd));
return r==SQL_SUCCESS || r==SQL_SUCCESS_WITH_INFO;
#else
mysql_init(&hDBC);
MYSQL * rx = mysql_real_connect(
&hDBC, dbcn, usr, pwd, NULL, 0, NULL, 0);
if(!rx) return 0;
return 1;
#endif
//end DB_Open

int DB_Exec(char * sql)

#ifdef WIN32
SQLHANDLE hStatement = NULL;
SQLAllocHandle(SQL_HANDLE_STMT, hDBC, &hStatement);
SQLExecDirect(hStatement,(unsigned char *)sql, strlen(sql));
SQLCloseCursor(hStatement);
SQLFreeHandle(SQL_HANDLE_STMT, hStatement);
hStatement = NULL;
#else
mysql_real_query (&hDBC, sql, strlen(sql));
#endif
return 1;
//end DB_Exec

int DB_Close(void)

#ifdef WIN32
SQLDisconnect(hDBC);
SQLFreeHandle(SQL_HANDLE_DBC, hDBC);
SQLFreeHandle(SQL_HANDLE_ENV, hDBEnv);
#else
mysql_close(&hDBC);
#endif
return 1;
//DB_Close()

#ifndef WIN32
typedef struct tagMySQLRecordset
MYSQL_RES * hRecord;
void * * row;
int * size;
int cols;
MYSQLRecordset;

#endif

void DB_CleanQuery(void *hRecordset)

if(!hRecordset) return;
#ifdef WIN32
__try
SQLCloseCursor(hRecordset);
SQLFreeHandle(SQL_HANDLE_STMT, hRecordset);
hRecordset = NULL;
__finally
return;
//end try
#else
MYSQLRecordset * hRec = (MYSQLRecordset *) hRecordset;
mysql_free_result (hRec->hRecord);
free(hRec->row); hRec->row = NULL;
free(hRec->size); hRec->size = NULL;
free(hRec); hRec = NULL;
#endif
//end DB_CleanQuery

int DB_Next(void * hRecordset)

int r=0; if(!hRecordset) return 0;
#ifdef WIN32
r = SQLFetch(hRecordset);
r = r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO;
if(!r)
DB_CleanQuery(hRecordset);
//end if
#else
MYSQLRecordset * hRec = (MYSQLRecordset *) hRecordset;
MYSQL_ROW row = mysql_fetch_row (hRec->hRecord);
if(row)
for(int i=0; i<hRec->cols; i++)
memcpy(hRec->row[i], row[i], hRec->size[i]);
//next i
r = 1;
else
DB_CleanQuery(hRecordset);
r = 0;
//end if
#endif
return r;
//end DB_Next

int DB_params_count(const char * fmt)

int i=0, j=0;
while(fmt[i])
if(fmt[i]=='%') j++;
i++;
//end while
return j;
//end DB_params_count

void * DB_Query(char *sql, const char *fmt, ...)

int r=0;
int cols = DB_params_count(fmt);
if(cols<1) return NULL;
#ifdef WIN32
SQLHANDLE hStatement = NULL;
SQLAllocHandle(SQL_HANDLE_STMT, hDBC, &hStatement);
r = SQLExecDirect(hStatement,(unsigned char *)sql, strlen(sql));
r = r==SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO;
if(!r)
return NULL;
//end if
#else
r = mysql_real_query (&hDBC, sql, strlen(sql));
if(r) return NULL;
MYSQL_RES * rec = NULL;
rec = mysql_store_result (&hDBC);
if(!rec) return NULL;
MYSQLRecordset * hStatement
= (MYSQLRecordset *)malloc(sizeof(MYSQLRecordset));
if(!hStatement) return NULL;
memset(hStatement, 0, sizeof(MYSQLRecordset));
hStatement->hRecord = rec;
hStatement->cols = cols;
hStatement->row = (void **)malloc(cols * sizeof(void *));
memset(hStatement->row, 0, cols * sizeof(void *));
hStatement->size = (int *)malloc(cols * sizeof(int));
memset(hStatement->size, 0, cols * sizeof(int));
#endif
va_list ap; va_start(ap, fmt);
void * var; char buf[32];
int i=0,j=0,k=0,sz=0; char c=0;
int len = strlen(fmt); int bad=1;
#ifdef WIN32
int col=1;
#else
int col=0;
#endif
while(fmt[i])
c = fmt[i++];
if(c != '%') continue;
c = fmt[i++];
var = va_arg(ap, void *);
if(c == 'd')
#ifdef WIN32
SQLBindCol(hStatement, col, SQL_C_SLONG, var, 4,NULL);
#else
hStatement->row[col] = var;
hStatement->size[col] = sizeof(long);
#endif
col++;
continue;
//end if
if(c == 'f')
#ifdef WIN32
SQLBindCol(hStatement, col, SQL_C_FLOAT, var, 4,NULL);
#else
hStatement->row[col] = var;
hStatement->size[col] = sizeof(float);
#endif
col++;
continue;
//end if
memset(buf, 0, 32); bad=1;
for(j=i-1; j<len; j++)
c = fmt[j];
if(c>='0' && c<='9') buf[j-i+1]=c;
if(c=='s') bad=0; k=j+1; break;
//next j
if(bad) return NULL;
sscanf(buf, "%d", &sz);
#ifdef WIN32
SQLBindCol(hStatement, col, SQL_C_CHAR, var, sz, NULL);
#else
hStatement->row[col] = var;
hStatement->size[col] = sz;
#endif
col++;
i = k;
//end while
va_end(ap);
return hStatement;
//end DB_Rec
参考技术A

拿到cursor对象后调用Cursor类的方法即可
如:      

  String[] strs = new String[cursor.getCount()];
       String columnName="";
       int position = 0;
//        cursor.moveToPosition(position);
       cursor.moveToFirst();
       while (cursor.moveToNext()) 
           int index = cursor.getColumnIndex(columnName);
           String str = cursor.getString(index);
           strs[position++] = str;
       

如何将获取的对象保存到核心数据

【中文标题】如何将获取的对象保存到核心数据【英文标题】:How to save fetched objects to core data 【发布时间】:2012-10-22 21:00:25 【问题描述】:

我对一般编程特别是客观的 c 核心数据非常陌生。我正在尝试从电子表格中读取数据并将其显示在表格视图中。我为保存对象而创建的数组是空的。我不确定如何将数据保存到数组中。另外,我收到警告说存储的值永远不会被读取。非常感谢您对此提供的任何帮助——在我力所能及的范围内。

这是我的代码:

DataStorage *parentTab;
parentTab = (DataStorage *)self.parentViewController;
_context = [parentTab context];

[self populateCollegeObjects];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *dataEntity = [NSEntityDescription entityForName:@"CollegeList"     inManagedObjectContext:_context];
[fetchRequest setEntity:dataEntity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"collegeName" ascending:YES];

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

[fetchRequest setSortDescriptors:sortDescriptors ];
[sortDescriptors release];
[sortDescriptor release];

NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:_context sectionNameKeyPath:nil cacheName:nil];
[fetchRequest release];

NSError *error;
[controller performFetch:&error];

for (int counter = 0; counter< [sortDescriptors count]; counter ++)

   if ([_collegeObjects count] == 0)
    
        _collegeObjects = [[NSArray alloc] init];

        CollegeList *addCollege;

        //addCollege = [CollegeList initWithName:<#(NSString *)#> andURL:<#(NSString *)#> andDetail:<#(NSString *)#> forContext:<#(NSManagedObjectContext *)#>_context];
    

【问题讨论】:

我认为 sortDescriptors 和 fetchRequest 释放语句应该在 performFetch 方法之后。 对不起,我没有得到一件事 - 您在 NSFetchedReultsController 中获取数据,然后保存该数据(使用 initWithName)? 你到底在问什么?您想从电子表格中读取数据并将它们放入 tableview 中,然后您有一个空数组?这个数组是从哪里来的?在您的问题中,您一次没有提到核心数据。您在哪里需要这方面的核心数据? 【参考方案1】:

我不太确定您的问题到底是什么。该数组是否假设填充了您的核心数据中的实体?

也许你可以试试这个看看是否有帮助:

[fetchRequest setEntity:dataEntity];
NSArray *fetchedObjects = [_context executeFetchRequest: fetchRequest error: nil];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"collegeName" ascending:YES];

NSArray *sortDescriptors = @[sortDescriptor];
NSArray *sortedFetchedObjects = [fetchedObjects sortedArrayUsingDescriptors:sortDescriptors];

sortedFetchedObjects 应包含您正在查找的已排序对象的数组。

【讨论】:

我尝试了您建议的代码,并将发布声明移至 @user427969 推荐的 perform fetch 方法之后。两者都不起作用 - 数组仍然是空的。

以上是关于如何将数据库的数据读取到数组中的主要内容,如果未能解决你的问题,请参考以下文章

c# 中,如何读取XML文件,并将读取到的内容显示到TreeView中

java读取文件中多个数据,放入不同数组

C# 中如何将SQL数据库中读取到的 一整行数据 存到数组,最好是list中,请写详细答案

C 语言文件操作 ( 将结构体写出到文件中并读取结构体数据 | 将结构体数组写出到文件中并读取结构体数组数据 )

c语言读取文件然后保存到数组中

IOS - 目标 C,如何读取核心数据并将其存储到可变数组中