如何使用结构创建数据库表

时间:2014-06-13 16:37:57

标签: c database data-structures structure firebird

我正在尝试使用c接口创建和存储数据库。我有一个包含一些变量和数据类型的结构表。我如何将它们转换为数据库表。详情如下。在,database.c文件中,我初始化了createTable函数和包含约束和数据类型的Folder_table结构,我有一个函数连接到firebird中的数据库。一旦我读到这个结构,我想知道如何将这个结构转换成表并将其存储在数据库中。 (我可以用sprintf做些什么吗?)

**database.c:**
#include "/Library/Frameworks/Firebird.framework/Versions/A/Headers/ibase.h"
#include <stdio.h>
#include <string.h>

void* CreateTable(char *tableName, uint rows)
{
    int error   = 0;
    void *table;

    //// Allocate table
    table = Allocate(GetTableSize(tableName)*rows);

    //// List table pointers
    for(uint rowNumber=0; rowNumber < rows; rowNumber++)
    {
        //// Add code to Connect linked list row pointers
    }

    return error;
}

typedef struct Folder_Table       // Table type name gets "_Table" added to the SQLite name
{
    //// Fields                   // Comments are added to seperate the fields, Relationships, and metadata
    int     folderID;             // Fields are added as elements of the type and length listed in SQLite
    float   field1;
    int     field2;
    float   field3;
    char    field4[40];           // string length '40' is queried from SQLite settings for field

} Folder_Table;
int SQLOpen(void)
{
    char                logInData [256];
    short               bufferLength;
    sprintf(logInData, "%c%c%c%c%c%c%s%c%c%s",      isc_dpb_version1,
            isc_dpb_num_buffers,
            1,
            90,
            isc_dpb_user_name,
            strlen("SYSDBA"),
            "SYSDBA",
            isc_dpb_password,
            strlen("masterkey"),
            "masterkey");

    bufferLength = strlen(logInData);
    if (isc_attach_database(status_vector, strlen(DATABASE_PATH), DATABASE_PATH, &DatabaseHandle,bufferLength, logInData))
    {

        isc_print_status(status_vector);

    }


    return 0;

}
**main.c:**
#include <stdio.h>
#include<string.h>
#include "/Library/Frameworks/Firebird.framework/Versions/A/Headers/ibase.h"

char  Query[] = "SELECT * FROM Folder_Table WHERE ID = 3";
int main(int argc, char *argv[])
{
    SQLOpen();
    Folder_Table *myTable;
    myTable = CreateTable("Folder_Table", ONE_ROW);

}

1 个答案:

答案 0 :(得分:0)

你已经开始定义你的folder_table布局。如果这是您的数据表需要的数据,那么就完成了。这里没有魔力。您只需要使用您为表定义的字段顺序中的SQL INSERT命令将结构成员写入表中。

目前,您的folder_table函数和sprintf的使用似乎只是将您的所有登录信息收集到logInData缓冲区中,然后附加到数据库。如果成功附加,则需要循环来遍历所有结构数据,并使用SQL INSERT命令将该数据插入到表中。你还没有代码。

你可以尝试做一些类似于插入结构值本身的东西。您将需要以类似的方式创建SQL插入语句。将构建类似于"INSERT INTO tablename (FIELD1, FIELD2, FIELD3, FIELD4) VALUES ('VALUE1', 'VALUE2', 'VALUE3', VALUE4');"的缓冲区的东西同样附加到数据库并为每个结构元素执行sql命令。

您可以继续使用firebird,也可以使用sqlite本身提供的C-API。我没有使用过firebird,所以我不知道与提供的SQLite API相比会有多麻烦,但SQLite C-API相对简单直接。

作为语法,只需参考An Introduction To The SQLite C/C++ Interface以使用SQLite连接器,或者查看Firebird Connectivity and API以获取firebird连接。

最重要的是,确保在拿起键盘并尝试对其进行编码之前已经定义了数据库和表格布局。大部分混淆似乎来自这样一个事实,即您并不确切地知道您希望包含结构数据的表格看起来像什么。如果您的struct Folder_Table是您想要的定义,那么在创建表的情况下,循环遍历结构数据,并在每次迭代时使用insert命令写出成员。

在定义表格后,有很多示例可以帮助您实现表格。 SQLite C/C++ Tutorial

这可能是我可以根据您的代码所在位置给出的最佳路线图。将您的结构成员映射到INSERT语句中,然后如果遇到问题,您可以提出更具体的问题(例如,为什么我会收到错误...)