- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 c 程序,提示用户输入产品制造商,并应根据用户输入进行查询,以打印该制造商生产的所有产品,无论它们是 PC、笔记本电脑还是打印机。然而,这里出了点问题,因为在返回一行后我得到了两个 sql 状态:
SQLSTATE-02000 和 SQLSTATE=24000
这些都不在我搜索过的sql错误代码中。
下面我包含了我正在使用的 .c 文件和 .sql 架构。
非常感谢任何帮助。
#include <stdio.h>
#include <stdlib.h>
/*** header file for ORACLE definitions ***/
exec sql include sqlca;
int print_sql_state(char *code){
printf("\nSQLSTATE=%s\n", code);
}
int main()
{
/*** Variable Declaration Block ***/
exec sql begin declare section;
char login[129], password[129];
char SQLSTATE[6];
/*query based on*/
char maker[40];
/*results based on product*/
int model;
char type[40];
/*results based on type of product*/
float speed;
int ram;
int hd;
float screen;
int price;
exec sql end declare section;
/*** handler for error ***/
exec sql whenever sqlerror goto report_error;
exec sql whenever not found goto notfound;
/*** Prompt user for login name and password ***/
printf("Username=");
gets(login);
printf("Password=");
char *pass_string = malloc(128);
pass_string=getpass("");
strcpy(password, pass_string);
/*** Connect to DB ***/
exec sql connect :login
identified by :password;
printf("\nCONNECTION SUCCESSFUL\n");
/*** INSERT RECORD WITH VALUES PROVIDED BY USER ***/
while(1){
printf("\nInput manufacturer:");
scanf("%s", &maker);
if (maker==-1) /* end loop */
return 0;
/*** cursor declaration ***/
exec sql declare specs_1 cursor for
SELECT P.model, P.speed, P.ram, P.hd, P.price
FROM Product PR, PC P
WHERE PR.model = P.model AND PR.maker = :maker
UNION
SELECT L.model, L.speed, L.ram, L.hd, L.price
FROM Product PR, Laptop L
WHERE PR.model = L.model AND PR.maker = :maker;
/*seperate query since not Union Compatible*/
exec sql declare specs_2 cursor for
SELECT P.model, P.price
FROM Product PR, Printer P
WHERE PR.model = P.model AND PR.maker = :maker;
exec sql open specs_1;
/*** TRAVERSE RESULT SET WITH CURSOR ***/
while(1){
EXEC SQL
FETCH specs_1 into :model, :speed, :ram, :hd, :price;
printf("\nModel = %d, Speed = %f, Ram = %d, hd = %d, Price = %d",
model, speed, ram, hd, price);
}
exec sql open specs_2;
/*** TRAVERSE RESULT SET WITH CURSOR ***/
while(1){
EXEC SQL
FETCH specs_2 into :model, :price;
printf("\nModel = %d, Price = %d", model, price);
}
continue;
exec sql close specs_1;
exec sql close specs_2;
notfound:
printf("\nNO DATA");
print_sql_state(SQLSTATE);
exec sql close specs_1;
exec sql close specs_2;
}
report_error:
printf("\nCONNECTION ERROR\n");
print_sql_state(SQLSTATE);
return 1;
}
和 SQL
CREATE TABLE Product(
maker VARCHAR(50),
model INTEGER PRIMARY KEY,
type VARCHAR(10) /*PC, Laptop, or Printer*/
);
CREATE TABLE PC(
model INTEGER PRIMARY KEY, /*model number*/
speed REAL,
ram INTEGER,
hd INTEGER,
price INTEGER /*"in dollars"*/
;
CREATE TABLE Laptop(
model INTEGER PRIMARY KEY,
speed REAL,
ram INTEGER,
hd INTEGER,
price INTEGER,
screen INTEGER
);
CREATE TABLE Printer(
model INTEGER PRIMARY KEY, /*model number*/
price INTEGER /*"in dollars"*/
);
编辑:::输入“Dell”作为“制造商”时我的程序的输出
Username=me
Password=
CONNECTION SUCCESSFUL
Input manufacturer:Dell
Model = 1, Speed = 3.400000, Ram = 4000, hd = 125, Price = 999
NO DATA
SQLSTATE=02000
CONNECTION ERROR
SQLSTATE=24000
编辑::这些是我一直在使用的测试插入。
INSERT INTO Product Values('Alien', 5, 'PC');
INSERT INTO PC Values(5, 3.0, 8000, 500, 1299);
INSERT INTO Product Values('HP', 7, 'PC');
INSERT INTO PC Values(7, 3.0, 8000, 500, 2899);
INSERT INTO Product Values('Toshiba', 8, 'PC');
INSERT INTO PC Values(8, .3, 1000, 20, 299, 10);
INSERT INTO Product Values('Dell', 1, 'Laptop');
INSERT INTO Laptop Values(1, 3.4, 4000, 125, 999, 13);
INSERT INTO Product Values('Sony', 4, 'Laptop');
INSERT INTO Laptop Values(4, 1.2, 2000, 20, 299, 10);
INSERT INTO Product Values('HP', 2, 'Laptop');
INSERT INTO PC Values(2, 1.0, 8000, 500, 899, 19);
INSERT INTO Product Values('Toshiba', 9, 'Laptop');
INSERT INTO Laptop Values(9, .4, 900, 20, 299, 10);
INSERT INTO Product Values('Toshiba', 10, 'Laptop');
INSERT INTO Laptop Values(10, .4, 900, 20, 299, 13);
INSERT INTO Product Values('Toshiba', 11, 'Laptop');
INSERT INTO Laptop Values(11, .4, 900, 20, 299, 10);
INSERT INTO Product Values('Toshiba', 12, 'Laptop');
INSERT INTO Laptop Values(12, .4, 900, 20, 299, 19);
INSERT INTO Product Values('Dell', 3, 'Printer');
INSERT INTO Printer Values(3, 199);
INSERT INTO Product Values('Kodak', 6, 'Printer');
INSERT INTO Printer Values(6, 300);
最佳答案
SQL 错误代码代码将位于 SQLCODE 而不是 SQLSTATE 中。 SQLSTATE 为 2000 只是意味着没有更多行。 24000 表示光标处于无效状态,如果您继续使用它,这正是我所期望的。您可能应该从代码外部检查语句,以确保您确实获得不止一行。
<小时/>话虽如此,您的代码中也有一些可疑的事情。第一个是为密码分配 128 字节,然后通过将指针设置为 getpass()
的返回值来立即泄漏它。第二个是当 maker == -1
导致中断时外循环的退出条件。由于 maker
是一个字符数组,因此它永远不会为 -1。
您还应该检查(并告诉我们)程序的实际输出 - 这将为问题发生的位置提供重要线索。
<小时/>并且,根据您的插入语句,您将获得一行。您插入一台戴尔笔记本电脑和一台戴尔打印机,但您的第一个光标查询仅查找笔记本电脑和 PC(其中分别有 1 和 0)。
因此 2000(没有更多数据)是数据库的正确响应。
现在您可能认为您的第二个查询应该获取打印机,并且如果它已运行,它就会获取打印机。不幸的是,由于第一个查询“没有数据”,第二个查询被完全跳过并返回到外循环。
如果您将打印机位添加为另一个 union ,并且仅选择速度、RAM 和 HD 大小的常量,您可能可以将其作为单个查询来执行。当然,您需要一个额外的列来区分这两种类型(有和没有这些字段)。
或者,您可以为每个查询提供其自己的错误处理代码,以便在第一个查询停止时不会跳过第二个查询。
关于sql - 使用 db2 在 C 程序中嵌入 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13449986/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!