ADO+SQL7的BUG吗?使用SQLSERVER 7.0的朋友看过来,我遇到一个怪问题了,不知是何原因,帮忙看看。。。 问题已确认是BUG,但很怪,有分析数据

  • 主题发起人 主题发起人 yym
  • 开始时间 开始时间
是否为BUG大家帮忙测试一下便知,我这里的环境是这样,但我没有另一环境可测试呀。
有 DELPHI+sqlserver7 的朋友劳费您一点时间可以吗?
 
我這邊是d5+sql7
我看這些代碼都沒問題
字段是什麼類型的,我幫你試試
 
谢谢,stuwe,字段是字符形的
sql语句如下:
CREATE TABLE [dbo].[TEST1] (
[id] [decimal](18, 0) IDENTITY (1, 1) NOT NULL ,
[a] [char] (10) NULL ,
[char] (10) NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TEST2] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[c] [char] (10) NULL ,
[d] [char] (10) NULL
) ON [PRIMARY]
GO
 
我測試過了,的確是這樣的,但兩個表的順序倒過來就正常

我繼續看看
 
谢谢stuwe,那这样子已可以确认是ADO 的BUG了,是否在事务处理中EXECSQL是隐式的事务
引起的。因为实际的编程中不可能都能调换前后顺序或虽然可变通解决,但不能老这样吧。
上面的语句应该是正确的,请各位富翁相助。
 
看來真的是bug來的
1.兩個append正常
2.兩個insert into隻有第一個保存
3.第一個insert,第二個append正常
4.第一個append,第二個insert隻有後一個保存

不用事務處理1,2,3,4都正常
可能是事務處理有問題

 
谢谢stuwe的测试,我下面把分析数据贴出来,希望有高手可以解决。。。

adoqeury2在前adoquery1在后,可以保存数据的事件探查结果
1、set implicit_transactions on
2、declare @P1 int
set @P1=NULL
exec sp_prepare @P1 output, NULL, N'insert into test2(c,d)
', 1
select @P1
3、SET FMTONLY ON select c,d from test2 SET FMTONLY OFF
4、declare @P1 int
set @P1=NULL
exec sp_prepare @P1 output, N'@P1 char(10),@P2 char(10)', N'insert into test2(c,d)
values(@P1,@P2)
', 1
select @P1
5、sp_unprepare 1
6、sp_executesql N'insert into test2(c,d)
values(@P1,@P2)
', N'@P1 varchar(10),@P2 varchar(10)', 'ccccccc', 'ddddddd'
7、declare @P1 int
set @P1=NULL
exec sp_prepare @P1 output, NULL, N'select * from test1
', 1
select @P1
8、sp_unprepare 2
9、SET NO_BROWSETABLE ON
10、select * from test1
11、sp_executesql N'INSERT INTO "TestDB".."test1" ("a","b") VALUES (@P1,@P2)', N'@P1 varchar(10),@P2 varchar(10)', 'aaaaaa ', 'bbbbbb '
12、SELECT @@IDENTITY
13、IF @@TRANCOUNT > 0 COMMIT TRAN


adoqeury1在前adoquery2在后,不能保存数据的事件探查结果
1、set implicit_transactions on
2、declare @P1 int
set @P1=NULL
exec sp_prepare @P1 output, NULL, N'select * from test1
', 1
select @P1
3、sp_unprepare 1
4、SET NO_BROWSETABLE ON
5、select * from test1
6、sp_executesql N'INSERT INTO "TestDB".."test1" ("a","b") VALUES (@P1,@P2)', N'@P1 varchar(10),@P2 varchar(10)', 'aaaaaa ', 'bbbbbb '
7、SELECT @@IDENTITY
8、SET NO_BROWSETABLE OFF
9、declare @P1 int
set @P1=NULL
exec sp_prepare @P1 output, NULL, N'insert into test2(c,d)
', 1
select @P1
10、SET FMTONLY ON select c,d from test2 SET FMTONLY OFF
11、declare @P1 int
set @P1=NULL
exec sp_prepare @P1 output, N'@P1 char(10),@P2 char(10)', N'insert into test2(c,d)
values(@P1,@P2)
', 1
select @P1
12、sp_unprepare 2
13、sp_executesql N'insert into test2(c,d)
values(@P1,@P2)
', N'@P1 varchar(10),@P2 varchar(10)', 'ccccccc', 'ddddddd'
14、IF @@TRANCOUNT > 0 COMMIT TRAN
 
你为什么非得用append呢,那跟用table有什么区别呀,还不如table方便呢。
你试过两个都用insert into语句吗?难道也是第二个能写进去,第一个写不进去?
我以前用过5个都没问题,你还是好好试试用SQL写吧,应该没问题的,另外,其实你根本不用
两个ADOQuery,用一个就行了,写完第一个把它关了,然后在写第二个,这些都是我以前写
程序用过的,肯定没问题。
 
ADO老是出莫名其妙的问题,欲爱不能呀。
 
同意左右手。
 
樓主,都這第久了還沒找到更好的解決方法?

順便問一下左右手,你用過ADO+SQL7英文版開發嗎?
如果你用過你就知道,我用一個ADOQuery插入記錄的時候,insert語句有20多個字段,難道都寫在sql.text裡面嗎?
還有,我用的是繁體系統開發(簡體下我沒試過),當用ADOQuery操作(使用參數)的時候參數值隻要有中文都會出錯。
有時甚至沒有中文也會出錯,到現在都不得其解。
但直接adoquery.insert;或adoquery.append;後給字段賦值又沒事,正常。又為什麼呢?
假如我不用append,就直接執行sql語句,你說我該怎麼寫入數據???[:(][:(]
這個問題我真的想了很久都解決不了,都不知道為什麼。

 
想不通,为什么还揪着SQL7不放?
 
to:haizhong
有時不是你說用什麼就什麼的,公司叫你用7難道你用2000嗎?
 
to:stuwe
我以前就是用的ADO+SQL7英文版做的开发,程序跑了有两年了,一直好好的,没问题。
当然是都写在sql.text里了,难道你用adotable不用把这些字段都写上去就能存进去??
记住,尽量少用数据控件中类似append这样的操作数据库的方法,用SQL语句是最保险的了

繁体的我没用过,我用的是简体的,你说的参数的那个问题可能跟BIG5码有关系?
你把delphi的两个ADO补丁装上试试,我在简体下没装补丁时,汉字也有问题,装了就好了。
如果还不行你再装个不同版本的mdac试试,如果都试过了还不行,那偶也不知道什么毛病了,
因为偶也没碰到过这问题,不太好说是哪的毛病
 
to:左右手
我的程序剛開始是用Access,後來因為Access的多用戶連接有問題,就改為SQL
如果說是ADO補丁的問題,我也覺得奇怪,為什麼參數在Access裡面都正常,sql就不能
雖然用SQL語句是好一點,但我覺得無所謂用什麼,隻要你覺得那一種方法可以實現,
代碼少就行。不管是直接append或是sql語句,我覺得都得用事務處理。

就像樓主那個問題,我試了,果然是那樣的,但不用事務處理都正常,這也是一個問題?[?]
 
呵呵,虽然我也很懒,也总想少写代码,但是这要建立在系统能稳定并且效率能够满足需要
的情况下才可以,如果多写几句代码能让你的系统更稳定或效率更高,干什么不多写这几句呢
coder就是写代码的,如果连代码都懒的写,那还做什么coder
你是两句都用的sql语句试的吗?我以前用过应该没问题的呀。我回去试试
另外他这个try用的有点问题,怎么还没开始事务呢就try了呀
 
来自:stuwe, 时间:2003-5-17 9:33:00, ID:1869240 | 编辑
看來真的是bug來的
1.兩個append正常
2.兩個insert into隻有第一個保存
3.第一個insert,第二個append正常
4.第一個append,第二個insert隻有後一個保存

不用事務處理1,2,3,4都正常
可能是事務處理有問題


上面都有我提供的測試結果

 
我也曾经遇到过这样的问题,只是我用的Access数据库。如果两个都用Insert,确实只能保存
第一个。后来我发现我将其中的一个ADOQuery的Lock Type属性设为了ltBatchOptimistic,
将其更改为ltOptimiscitc后,能够正确插入数据了,估计是其在Access数据库中不能支持这种方式。
SQL Server7.0我没有试过,是不是同样的不支持的问题,你不妨试一下,看行不行?!
 
ado控件问题确实不少,但写数据库时直接用Sql语句一般不会出错
 
我在win98繁體+sql7.0英文版下測試完全正確.
 
后退
顶部