免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5747 | 回复: 0
打印 上一主题 下一主题

[C++] MFCODBC使用者操作SQL2005数据库问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-21 21:05 |只看该作者 |倒序浏览
操作sql2005的存储过程提示函数序列错误,但是存储过程却执行成功了,成功修改了数据,我也查过了序列啊,顺序和存储过程的一样啊,这个是怎么回事?我跟到最后显示汇编了,跟不到地方上,但是lpszSQL这个指针确实空值,什么原因呢?
代码如下
CMTmodifyTeacher.cpp文件
  1. #include "stdafx.h"
  2. #include "MTmodifyTeacher.h"
  3. IMPLEMENT_DYNAMIC(CMTmodifyTeacher, CRecordset)

  4. CMTmodifyTeacher::CMTmodifyTeacher(CDatabase* pdb)
  5.         : CRecordset(pdb)
  6. {
  7.         m_lResultValue = 0;

  8.         m_TNO = "";
  9.         m_TNAME = "";
  10.         m_TBIRTH = "";
  11.         m_TSEX = "";
  12.         m_TPHONE = "";
  13.         m_TPOST = "";
  14.         m_TCOURSE = "";
  15.         m_TDEPART = "";
  16.         m_TFACE = "";

  17.         m_TOLDNO = "";

  18.         m_nParams = 11;

  19.         m_nFields = 0;
  20.         m_nDefaultType = dynaset;
  21. }
  22. //#error Security Issue: The connection string may contain a password
  23. // 此连接字符串中可能包含明文密码和/或其他重要
  24. // 信息。请在查看完此连接字符串并找到所有与安全
  25. // 有关的问题后移除 #error。可能需要将此密码存
  26. // 储为其他格式或使用其他的用户身份验证。
  27. CString CMTmodifyTeacher::GetDefaultConnect()
  28. {
  29.         return _T("DSN=endscp;uid=sa;pwd=;");
  30. }

  31. CString CMTmodifyTeacher::GetDefaultSQL()
  32. {
  33.         return _T("{?=call modify_teacher(?,?,?,?,?,\
  34.                           ?,?,?,?,?)}");
  35. }

  36. void CMTmodifyTeacher::DoFieldExchange(CFieldExchange* pFX)
  37. {
  38.         pFX->SetFieldType(CFieldExchange::outputParam);
  39. // RFX_Text() 和 RFX_Int() 这类宏依赖的是
  40. // 成员变量的类型,而不是数据库字段的类型。
  41. // ODBC 尝试自动将列值转换为所请求的类型
  42.         RFX_Long(pFX, _T("[@return_value]"), m_lResultValue);


  43.         pFX->SetFieldType(CFieldExchange::inputParam);

  44.         RFX_Text(pFX, _T("[TNO]"), m_TNO);
  45.         RFX_Text(pFX, _T("[TNAME]"), m_TNAME);
  46.         RFX_Text(pFX, _T("[TBIRTH]"), m_TBIRTH);
  47.         RFX_Text(pFX, _T("[TSEX]"), m_TSEX);
  48.         RFX_Text(pFX, _T("[TPHONE]"), m_TPHONE);
  49.         RFX_Text(pFX, _T("[TPOST]"), m_TPOST);
  50.         RFX_Text(pFX, _T("[TCOURSE]"), m_TCOURSE);
  51.         RFX_Text(pFX, _T("[TDEPART]"), m_TDEPART);
  52.         RFX_Text(pFX, _T("[TFACE]"), m_TFACE);

  53.         RFX_Text(pFX, _T("[@toldnum]"), m_TOLDNO);

  54. }
复制代码
CMTmodifyTeacher.h文件
  1. #pragma once

  2. // 代码生成在 2013年4月17日, 1:52

  3. class CMTmodifyTeacher : public CRecordset
  4. {
  5. public:
  6.         CMTmodifyTeacher(CDatabase* pDatabase = NULL);
  7.         DECLARE_DYNAMIC(CMTmodifyTeacher)

  8. // 字段/参数数据

  9. // 以下字符串类型(如果存在)反映数据库字段(ANSI 数据类型的 CStringA 和 Unicode
  10. // 数据类型的 CStringW)的实际数据类型。
  11. //  这是为防止 ODBC 驱动程序执行可能
  12. // 不必要的转换。如果希望,可以将这些成员更改为
  13. // CString 类型,ODBC 驱动程序将执行所有必要的转换。
  14. // (注意: 必须使用 3.5 版或更高版本的 ODBC 驱动程序
  15. // 以同时支持 Unicode 和这些转换)。

  16.         long m_lResultValue;

  17.         CStringA        m_TNO;
  18.         CStringA        m_TNAME;
  19.         CStringA        m_TBIRTH;
  20.         CStringA        m_TSEX;
  21.         CStringA        m_TPHONE;
  22.         CStringA        m_TPOST;
  23.         CStringA        m_TCOURSE;
  24.         CStringA        m_TDEPART;
  25.         CStringA        m_TFACE;

  26.         CStringA    m_TOLDNO;

  27. // 重写
  28.         // 向导生成的虚函数重写
  29.         public:
  30.         virtual CString GetDefaultConnect();        // 默认连接字符串

  31.         virtual CString GetDefaultSQL();         // 记录集的默认 SQL
  32.         virtual void DoFieldExchange(CFieldExchange* pFX);        // RFX 支持

  33. // 实现
  34. #ifdef _DEBUG
  35.         virtual void AssertValid() const;
  36.         virtual void Dump(CDumpContext& dc) const;
  37. #endif

  38. };
复制代码
存储过程如下
  1. set ANSI_NULLS ON
  2. set QUOTED_IDENTIFIER ON
  3. go




  4. -- =============================================
  5. --Created by wln,2013/04/10
  6. -- =============================================
  7. ALTER PROCEDURE [dbo].[modify_teacher]
  8.         (       
  9.                 @teachernum [varchar](15),
  10.                 @teachername [varchar](50),
  11.                 @teacherbirth [varchar](50),
  12.                 @teachersex [varchar](5),
  13.                 @teacherphone [varchar](12),
  14.                 @teacherpost [varchar](20),
  15.                 @teachercourse [varchar](20),
  16.                 @teacherdepart [varchar](20),
  17.                 @teacherface [varchar](20),

  18.                 @teacheroldnum [varchar](15)
  19.         )
  20. AS

  21. BEGIN
  22. UPDATE [TEACHER]
  23. SET
  24.         [TNO] = @teachernum,
  25.         [TNAME] = @teachername,
  26.         [TBIRTH] = @teacherbirth,
  27.         [TSEX] = @teachersex,
  28.         [TPHONE] = @teacherphone,
  29.         [TPOST] = @teacherpost,
  30.         [TCOURSE] = @teachercourse,
  31.         [TDEPART] = @teacherdepart,
  32.         [TFACE] = @teacherface
  33. WHERE
  34. [TNO]= @teacheroldnum
  35. END
复制代码
然后是函数
  1. int CDataCenter::ModifyTeacher(TEAINFO& tea, CString oldnum)
  2. {
  3.         CMTmodifyTeacher stMod;

  4.         stMod.m_TNO = tea.teaNo;
  5.         stMod.m_TNAME = tea.teaName;
  6.         stMod.m_TBIRTH = tea.teaBirth;
  7.         stMod.m_TSEX = tea.teaSex;
  8.         stMod.m_TPHONE = tea.teaPhone;
  9.         stMod.m_TDEPART = tea.teaDepart;
  10.         stMod.m_TPOST = tea.teaPost;
  11.         stMod.m_TFACE = tea.teaFace;
  12.         stMod.m_TCOURSE = tea.teaCourse;

  13.         stMod.m_TOLDNO = oldnum;

  14.         stMod.Open();
  15.         stMod.Close();
  16.         return 0;
  17. }
复制代码
这个是修改按钮的代码
  1. void CTeacherAdd::OnBnClickedButtonModify()
  2. {
  3.         // TODO: 在此添加控件通知处理程序代码
  4.         TEAINFO teacher;
  5.         UpdateData();

  6.         teacher.teaNo = m_strTeaNum;
  7.         teacher.teaName = m_strTeaName;

  8.         //得到combo_box的文本
  9.         int isel = m_comboTeaSex.GetCurSel();
  10.         m_comboTeaSex.GetLBText(isel, teacher.teaSex);

  11.         teacher.teaPhone = m_strTeaPhone;

  12.         isel = m_comboTeaDepart.GetCurSel();
  13.         m_comboTeaDepart.GetLBText(isel, teacher.teaDepart);

  14.         isel = m_comboTeaPosition.GetCurSel();
  15.         m_comboTeaPosition.GetLBText(isel, teacher.teaPost);

  16.         isel = m_comboTeaFace.GetCurSel();
  17.         m_comboTeaFace.GetLBText(isel, teacher.teaFace);

  18.         isel = m_comboTeaFace.GetCurSel();
  19.         m_comboTeaYear.GetLBText(isel, teacher.teaBirth);

  20.         teacher.teaCourse = m_strCourse;

  21.         m_DataCenter.ModifyTeacher(teacher, m_strOldNo);
  22. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP