⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vc_oracle2.txt

📁 在vc中创建数据库
💻 TXT
📖 第 1 页 / 共 5 页
字号:
		if(flag==1)
		{
			sqlUpdateSelect.append(" and ");
		}
		else
		{
			flag=1;
		}

		sqlUpdateSelect.append(fieldName);

		sqlUpdateSelect.append(" = \'");

		sqlUpdateSelect.append(fieldValue);

		sqlUpdateSelect.append("\'");
	}

	chSqlUpdateSelect = sqlUpdateSelect.c_str();
	
	cn = OCI_ConnPoolGetConnection(pool);

	if (cn)
	{
		st = OCI_StatementCreate(cn);
						
		OCI_ExecuteStmt(st,MT(chSqlUpdateSelect));

		OCI_Commit(cn);	

		rs = OCI_GetResultset(st);

		while (OCI_FetchNext(rs))
		{
		}

		n  = OCI_GetRowCount(rs);

		if(n!=0)
		{
			printf("说要修改的内容已存在,不需要进行修改!");

			return false;
		}
	}

	if(fkToPknum==0)                          //已经为表链的最前端,即不引用其它表的字段
	{
		if(strcmp(keyName,"key")==0)                  //判断是否存在key条件,如果存在即是对一条记录进行修改  ?
		{
			memset( pkColumn, '\0', sizeof(pkColumn));

			for(int i=2;i<fieldUpdateCount;i++)
			{
				fieldName = fieldUpdate_array[i].getFieldName();

				fieldValue = fieldUpdate_array[i].getFieldValue();

				for(int j=0;j<pknum;j++)
				{
					pkname = pkSign[j];

					if(strcmp(fieldName,pkname)==0)
					{
						strcpy(pkColumn[n++],pkname);

						truePknum++;
					}
				}
			}

			if(truePknum == pknum)                    //所给数据中PK键都给齐全了,即都要进行修改,
			{
				for(int i=0;i<pknum;i++)                           //用于统计主键是否需要进行修改
				{
					pkname = pkSign[i];

					pkvalue = select_value(tableName,pkname,keyName,keyValue);

					for(int i=2;i<fieldUpdateCount;i++)
					{
						fieldName = fieldUpdate_array[i].getFieldName();

						fieldValue = fieldUpdate_array[i].getFieldValue();

						if(strcmp(pkname,fieldName)==0)
						{
							if(strcmp(pkvalue,fieldValue)==0)
							{
								Unum++;                                 //Unum用于统计没有修改了的主键数
							}
						}
					}
				}

				if(Unum!=pknum)                                         //主键需要修改
				{
					flag = 0;

					sqlUpdateSelect = "select key from ";               //查询所要修改的主键是否已经存在,已存在则修改失败

					sqlUpdateSelect.append(tableName);

					sqlUpdateSelect.append(" where ");

					for(int i=2;i<fieldUpdateCount;i++)                              
					{
						fieldName = fieldUpdate_array[i].getFieldName();

						fieldValue = fieldUpdate_array[i].getFieldValue();

						for(int j=0;j<pknum;j++)
						{
							pkname = pkSign[j];

							if(strcmp(fieldName,pkname)==0)
							{				
								if(flag==1)
								{
									sqlUpdateSelect.append(" and ");
								}
								else
								{
									flag=1;
								}

								sqlUpdateSelect.append(fieldName);

								sqlUpdateSelect.append(" = \'");

								sqlUpdateSelect.append(fieldValue);

								sqlUpdateSelect.append("\'");
							}
						}
					}

					chSqlUpdateSelect = sqlUpdateSelect.c_str();
					
					cn = OCI_ConnPoolGetConnection(pool);

					if (cn)
					{
						st = OCI_StatementCreate(cn);
										
						OCI_ExecuteStmt(st,MT(chSqlUpdateSelect));

						OCI_Commit(cn);	

						rs = OCI_GetResultset(st);

						while (OCI_FetchNext(rs))
						{
							value = OCI_GetString(rs,1);  

							if(strcmp(value,keyValue)!=0)
							{
								printf("所要修改的值主键重复,修改失败!");

								return false;
							}
						}

						nn  = OCI_GetRowCount(rs);	

					}
					if(nn==0)                               
					{ 
						int q = 0,updnum = 0;                                                //不存在主键冲突

						memset( updatefeild, '\0', sizeof(updatefeild));

						if(fknum==0)                                                         //没有他表对该表内容进行引用
						{
							for(int i=0;i<fieldUpdateCount;i++)                              
							{
								fieldName = fieldUpdate_array[i].getFieldName();

								fieldValue = fieldUpdate_array[i].getFieldValue();

								strcpy(updatefeild[updnum][0][q],fieldName);             //updnum表示有多少条记录要改

								strcpy(updatefeild[updnum][1][q],fieldValue);

								q++;

							}

							updnum++;

							return true;
						}
						else                                                      //他表对该表内容进行了引用,将他表内容也进行修改             
						{
							for(int i=0;i<fieldUpdateCount;i++)                              
							{
								fieldName = fieldUpdate_array[i].getFieldName();

								fieldValue = fieldUpdate_array[i].getFieldValue();

								strcpy(updatefeild[updnum][0][q],fieldName);             //updnum表示有多少条记录要改

								strcpy(updatefeild[updnum][1][q],fieldValue);

								q++;

							}

							updnum++;

							flag = 0;

							int p;

							memset( temp_value, '\0', sizeof(temp_value));

							for(int i=0;i<fknum;i++)
							{
								tempTableN = fkSign[i][0];

								if(strcmp(tempTableN,"")==0)
								{
									break;
								}

								strcpy(temp_value[tempNum][0],tempTableN);

								sqlUpdateSelect = "select ";

								for(int j=1,q=1;j<20;j++)
								{
									tempField = fkSign[i][j];

									if(strcmp(tempField,"")==0)
									{
										break;
									}

									if(flag==1)
									{
										sqlUpdateSelect.append(",");
									}
									else
									{
										flag=1;
									}

									sqlUpdateSelect.append(tempField);

								}

								flag = 0;

								sqlUpdateSelect.append(" from ");

								sqlUpdateSelect.append(tableName);

								sqlUpdateSelect.append(" where ");

								sqlUpdateSelect.append(keyName);

								sqlUpdateSelect.append(" = \'");

								sqlUpdateSelect.append(keyValue);

								sqlUpdateSelect.append("\'");
								
								chSqlUpdateSelect = sqlUpdateSelect.c_str();					
										
								if (cn)
								{
									st = OCI_StatementCreate(cn);
										
									OCI_ExecuteStmt(st,MT(chSqlUpdateSelect));

									OCI_Commit(cn);	

									rs = OCI_GetResultset(st);

									while (OCI_FetchNext(rs))                    //循环存储表中主键纪录的值
									{
										const char *value;

										p = 1;

										while(p<=pknum)
										{
											value = OCI_GetString(rs,p);                  

											strcpy(temp_value[tempNum][p],value);

											p++;
												
										}

										tempNum++;
											
									}
										//n  = OCI_GetRowCount(rs);
								}
							}

							char *fkTableName,*fkFieldName;

							flag = 0;

							memset( temp_key, '\0', sizeof(temp_key));
							
							for(int i=0;i<fknum;i++)
							{
								sqlUpdateSelect = "select key from ";

								tempTableN = temp_value[i][0];

								fkTableName = fkSign[i][0];

								if(strcmp(tempTableN,"")==0)
								{
									break;
								}

								strcpy(temp_key[i][0],tempTableN); 

								sqlUpdateSelect.append(tempTableN);

								sqlUpdateSelect.append(" where ");

								for(int j=1;j<20;j++)
								{
									tempField = temp_value[i][j];

									fkFieldName = fkSign[i][j];

									if(strcmp(tempField,"")==0)
									{
										break;
									}

									if(flag==1)
									{
										sqlUpdateSelect.append(" and ");
									}
									else
									{
										flag=1;
									}

									sqlUpdateSelect.append(fkFieldName);

									sqlUpdateSelect.append(" = \'");

									sqlUpdateSelect.append(tempField);

									sqlUpdateSelect.append("\'");

								}
								flag = 0;

								chSqlUpdateSelect = sqlUpdateSelect.c_str();

								p = 1;
										
								if (cn)
								{
									st = OCI_StatementCreate(cn);
										
									OCI_ExecuteStmt(st,MT(chSqlUpdateSelect));

									OCI_Commit(cn);	

									rs = OCI_GetResultset(st);

									while (OCI_FetchNext(rs))                    //循环存储表中主键纪录的值
									{
										const char *value;

										value = OCI_GetString(rs,1);                  

										strcpy(temp_key[i][p],value);

										p++;
	
									}
									//n  = OCI_GetRowCount(rs);
								}								
							}

							char *tName;
						
							for(int k=0;k<20;k++)
							{
								tName = temp_key[k][0];

								if(strcmp(tName,"")==0)
								{
									break;
								}

								for(int i=0;i<fknum;i++)
								{
									tempTableN = fkSign[i][0];

									if(strcmp(tName,tempTableN)==0)
									{
										for(int j=1;j<20;j++)
										{
											tempField  = temp_key[k][j];

											if(strcmp(tempField,"")==0)
											{
												break;
											}

											strcpy(updatefeild[updnum][0][0],"tablename"); 

											strcpy(updatefeild[updnum][1][0],tempTableN); 

											strcpy(updatefeild[updnum][0][1],"key"); 

											strcpy(updatefeild[updnum][1][1],tempField);

											q=2;

											for(int h=1;h<20;h++)
											{
												fkFieldName = fkSign[i][h];

												if(strcmp(fkFieldName,"")==0)
												{
													break;
												}

												for(int i=0;i<fieldUpdateCount;i++)                              
												{
													fieldName = fieldUpdate_array[i].getFieldName();

													fieldValue = fieldUpdate_array[i].getFieldValue();

													if(strcmp(fkFieldName,fieldName)==0)
													{
														strcpy(updatefeild[updnum][0][q],fieldName);                      //updnum表示有多少条记录要改,此处为一

														strcpy(updatefeild[updnum][1][q],fieldValue);

														q++;

													}
												}
											}											

											updnum++;
										}
									}
								}								
							}
							return true;
						}
							
					}
				}
				else                                //主键信息不用修改时,要看是否引用了其它表的字段,即fkToPknum是否为0,fkToPk数组
				{
					int q = 0,updnum = 0;                                                //没有修改主键时,返回直接进行修改

					memset( updatefeild, '\0', sizeof(updatefeild));

					for(int i=0;i<fieldUpdateCount;i++)                              
					{
						fieldName = fieldUpdate_array[i].getFieldName();

						fieldValue = fieldUpdate_array[i].getFieldValue();

						strcpy(updatefeild[updnum][0][q],fieldName);                      //updnum表示有多少条记录要改,此处为一

						strcpy(updatefeild[updnum][1][q],fieldValue);

						q++;

					}

					updnum++;

					return true;					

				}
			}
			
			if(truePknum<pknum)                                                 //所给数据中PK键未给齐全时            
			{
				if(truePknum==0)                                                //truePknum为实际包含了的PK数
				{
					int q = 0,updnum = 0;                                       //不存在主键冲突,没有PK要修改

					memset( updatefeild, '\0', sizeof(updatefeild));

					for(int i=0;i<fieldUpdateCount;i++)                              
					{
						fieldName = fieldUpdate_array[i].getFieldName();

						fieldValue = fieldUpdate_array[i].getFieldValue();

						strcpy(updatefeild[updnum][0][q],fieldName);             //updnum表示有多少条记录要改

						strcpy(updatefeild[updnum][1][q],fieldValue);

						q++;

					}

					updnum++;

					return true;

				}
				else
				{
					memset( pkColumnValue, '\0', sizeof(pkColumnValue));

					for(int i=0;i<pknum;i++)                           //用于统计主键是否需要进行修改
					{
						pkname = pkSign[i];

						pkvalue = select_value(tableName,pkname,keyName,keyValue);

						strcpy(pkColumnValue[i],pkvalue);

					}

					for(int i=0;i<pknum;i++)   
					{						
						pkname = pkSign[i];

						tempField = pkColumnValue[i];

						for(int j=0;j<fieldUpdateCount;j++)                              
						{
							fieldName = fieldUpdate_array[j].getFieldName();

							fieldValue = fieldUpdate_array[j].getFieldValue();
				
							if(strcmp(pkname,fieldName)==0)
							{
								if(strcmp(tempField,fieldValue)!=0)
								{
									strcpy(pkColumnValue[i],fieldValue);

									Unum++;                                 //Unum用于统计没有修改了的主键数
								}
							}
						}
					}
					if(Unum!=0)                                            //主键需要修改
					{
						flag = 0;

						sqlUpdateSelect = "select key from ";               //查询所要修改的主键是否已经存在,已存在则修改失败

						sqlUpdateSelect.append(tableName);

						sqlUpdateSelect.append(" where ");

						for(int i=0;i<pknum;i++)   
						{						
							pkname = pkSign[i];

							tempField = pkColumnValue[i];
							
							if(flag==1)
							{
								sqlUpdateSelect.append(" and ");
							}
							else
							{
								flag=1;
							}

							sqlUpdateSelect.append(pkname);

							sqlUpdateSelect.append(" = \'");

							sqlUpdateSelect.append(tempField);

							sqlUpdateSelect.append("\'");
								
						}

						chSqlUpdateSelect = sqlUpdateSelect.c_str();
						
						cn = OCI_ConnPoolGetConnection(pool);

						if (cn)
						{
							st = OCI_StatementCreate(cn);
											
							OCI_ExecuteStmt(st,MT(chSqlUpdateSelect));

							OCI_Commit(cn);	

							rs = OCI_GetResultset(st);

							while (OCI_FetchNext(rs))
							{
								value = OCI_GetString(rs,1);  

								if(strcmp(value,keyValue)!=0)
								{
									printf("所要修改的值主键重复,修改失败!");

									return false;
								}
							}

							nn  = OCI_GetRowCount(rs);	
						}

						if(nn==0)                                //所要修改的内容不存在,可以修改                       
						{ 
							int q = 0,updnum = 0;                                                //不存在主键冲突

							memset( updatefeild, '\0', sizeof(updatefeild));

							if(fknum==0)                                                         //没有他表对该表内容进行引用
							{
								for(int i=0;i<fieldUpdateCount;i++)                              
								{
									fieldName = fieldUpdate_array[i].getFieldName();

									fieldValue = fieldUpdate_array[i].getFieldValue();

									strcpy(updatefeild[updnum][0][q],fieldName);             //updnum表示有多少条记录要改

									strcpy(updatefeild[updnum][1][q],fieldValue);

									q++;

								}

								updnum++;

								return true;
							}
							else                                                      //他表对该表内容进行了引用,将他表内容也进行修改             
							{
								for(int i=0;i<fieldUpdateCount;i++)                              
								{
									fieldName = fieldUpdate_array[i].getFieldName();

									fieldValue = fieldUpdate_array[i].getFieldValue();

									strcpy(updatefeild[updnum][0][q],fieldName);             //updnum表示有多少条记录要改

									strcpy(updatefeild[updnum][1][q],fieldValue);

									q++;

								}

								updnum++;

								flag = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -