佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1906|回复: 38

Johe07的VS2005~VB.Net问题集 - 不能加入parameter进query (#38楼)

[复制链接]
发表于 10-3-2006 09:56 AM | 显示全部楼层 |阅读模式
各位,以下是我写的code来show出报告。。。
Imports System.data.sqlclient
Imports System.Data

----------------------------------------------------------
Public Class frmMPL

    Private Sub CrystalReportViewer1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CrystalReportViewer1.Load

    End Sub

    Private Sub frmMPL_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim objConn As SqlConnection
        Dim daT1 As SqlDataAdapter
        Dim DataSet1 As DataSet
        Dim strConnection As String
        Dim strSQL As String
        
        strConnection = "User ID=" & Lid & " ; Password =" & Lpwd & "   ; Persist Security Info=False;Initial Catalog=mrpdb_dom ;Data Source=store-svr"
        objConn = New SqlConnection(strConnection)
        objConn.Open()
        strSQL = "SELECT DISTINCT line_mst.line_c, line_mst.line_nm, bom_mst.material_no, bom_mst.bom_qty, material_mst.material_nm, " _
                      & "material_mst.bag_qty,material_mst.material_kd, mps_data.lot_no, proc_combi_mst.product_no, proc_combi_mst.cusdesch_c1, " _
                      & "proc_combi_mst.cusdesch_c2(, proc_combi_mst.intdesch_c, mps_data.plan_qty)" _
                      & "FROM line_mst INNER JOIN" _
                      & "proc_combi_mst ON line_mst.line_c = proc_combi_mst.assy_line_c INNER JOIN" _
                      & "bom_mst ON proc_combi_mst.product_no = bom_mst.product_no AND" _
                      & "proc_combi_mst.cusdesch_c1 = bom_mst.cusdesch_c1 AND proc_combi_mst.cusdesch_c2 = bom_mst.cusdesch_c2 AND" _
                      & "proc_combi_mst.intdesch_c = bom_mst.intdesch_c INNER JOIN" _
                      & "material_mst ON bom_mst.material_no = material_mst.material_no INNER JOIN" _
                      & "mps_data ON proc_combi_mst.product_no = mps_data.product_no AND" _
                      & "proc_combi_mst.cusdesch_c1 = mps_data.cusdesch_c1 AND proc_combi_mst.cusdesch_c2 = mps_data.cusdesch_c2 AND" _
                    & "proc_combi_mst.intdesch_c = mps_data.intdesch_c And line_mst.line_c = mps_data.line_c" _
                    & "WHERE (line_mst.line_c = 'HYAL5DM') AND (bom_mst.issue_dest = 'C&C') AND (mps_data.plan_qty <> '0') AND" _
                    & "(LEFT(material_mst.material_kd, 1) <= 'A') AND (mps_data.lot_no = '2') OR" _
                    & "(line_mst.line_c = 'HYAL5DM') AND (bom_mst.issue_dest = 'C&C') AND (mps_data.plan_qty <> '0') AND (mps_data.lot_no = '2') AND" _
                    & "(material_mst.material_kd = 'TER')" _
                    & "ORDER BY material_mst.material_kd, bom_mst.material_no"



        daT1 = New SqlDataAdapter(strSQL, objConn)
        DataSet1 = New DataSet

        daT1.FillSchema(DataSet1, SchemaType.Source, "line_mst" )
        daT1.Fill(DataSet1, "line_mst,proc_combi,bom_mst,material_mst,mps_data" )


        Dim rpt As New MatRpt1
        rpt.SetDataSource(DataSet1)
        CrystalReportViewer1.ReportSource = rpt
        
        objConn.Close()

    End Sub
End Class


然后,当跑道我红色那两行时。。。就给我error message
"Line 1: Incorrect syntax near ','."

请问,我的code是哪里出了问题吗?

[ 本帖最后由 johe07 于 15-9-2006 09:46 AM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 10-3-2006 02:17 PM | 显示全部楼层
如果不用红色那两行,直接用以下这一行代替会怎样?

daT1.Fill(DataSet1)
回复

使用道具 举报

 楼主| 发表于 10-3-2006 02:19 PM | 显示全部楼层
还是得到一样的error message

还是我在DATASET那里,需要注意些什么吗?

[ 本帖最后由 johe07 于 10-3-2006 02:47 PM 编辑 ]
回复

使用道具 举报

发表于 10-3-2006 02:49 PM | 显示全部楼层
>>proc_combi_mst.cusdesch_c2(, proc_combi_mst.intdesch_c, mps_data.plan_qty)"
请问这行的cusdesch_c2(, 是...?
回复

使用道具 举报

 楼主| 发表于 10-3-2006 03:07 PM | 显示全部楼层
啊!!!!!

可以了可以了!!!!!
谢谢astral兄的细心观察!!!!
我真是太自信了。。。以为自己的query没有错。。。。
它通过了。。。

可是,里面的资料是空的。。。。
我CR里面design的data应该是拿我dataset.xsd里面tabel的field的是吗?
pass parameter的话,我CR里面的"Parameter Field",是不是要设定,然后是从我的coding里pass过去的?我这样的概念对吗?
回复

使用道具 举报

发表于 10-3-2006 03:23 PM | 显示全部楼层
原帖由 johe07 于 10-3-2006 03:07 PM 发表
啊!!!!!

可以了可以了!!!!!
谢谢astral兄的细心观察!!!!
我真是太自信了。。。以为自己的query没有错。。。。
它通过了。。。

可是,里面的资料是空的。。。。
我CR里面design的data应该 ...


你是用push method? 为何不尽量用pull method呢?
回复

使用道具 举报

Follow Us
 楼主| 发表于 10-3-2006 04:15 PM | 显示全部楼层
原帖由 astral 于 10-3-2006 15:23 发表


你是用push method? 为何不尽量用pull method呢?

pull 是要怎样的呢?

我pass parameter就是属于push method了吗?
回复

使用道具 举报

发表于 10-3-2006 11:07 PM | 显示全部楼层
原帖由 johe07 于 10-3-2006 04:15 PM 发表

pull 是要怎样的呢?

我pass parameter就是属于push method了吗?


如果我没记错的话。。。
pull: 由CR送出statement来retrieve data
push: 准备好datasource然后送给CR.
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 13-3-2006 11:59 AM | 显示全部楼层
我始终还是没有解决到问题。。。
我不知道发生了什么事,也许我少做一个步骤。。。。

由谁可以告诉我发生了什么事?
在我的dataset里面的table, 当我去preview data时,是有data的。
但是,当我把field拉到CR里面是,看不到data...
(就是说在CR里browse data时,是空的)
所以,show report时,我是看到field的header。。。。没有资料的。。。
回复

使用道具 举报

发表于 13-3-2006 11:36 PM | 显示全部楼层
能不能大概描述你在CR里是怎样design? 包括如何取得fields
回复

使用道具 举报

 楼主| 发表于 14-3-2006 08:25 AM | 显示全部楼层
好,我的程序是

1.add new item->Dataset1.xsd

2.从server explorer,连接我的SQL server,拿出了我需要的table,然后建立出table之间的relation.


3.加入新的crystalreport1.rpt,改名去MPL.rpt

4.从CR Design form里,选择Database Expert-->ADO.Net-->Dataset1


5.我加入了5个table在dataset1里,我就从这5个table里拉出我要用的field


当我去preview report时,显示出来的是空的,只出现我拉出来field的header name.  


回去design form,database field里,我选出其中一个field来browse data,也是空的。


我回到我的dataset1里的table去preview data,是有data show出来的。


我上网找了很多久,找到了相关的问题,不过是在C#下的做法。他说,要去VS command prompt里执行xsd.exe来建立出一个dataset1.vb
参考这个网站
我参照了第三个步骤的教学

我照着步骤作了-->  xsd.exe dataset1.xsd /d /l:VB


他建立出了一个dataset1.VB file,我放进我的program...却出了以下的错误



不过, 我不知道我该怎么纠正这些错误。。。

[ 本帖最后由 johe07 于 14-3-2006 08:49 AM 编辑 ]
回复

使用道具 举报

发表于 14-3-2006 09:11 AM | 显示全部楼层
你可以试看:
dim ds as new MPLS.DataSet1
然后fill ds
再把ds pass给CR
看看会结果如何
回复

使用道具 举报

 楼主| 发表于 31-3-2006 08:53 AM | 显示全部楼层
之前的问题,已经解决了。。。。问题出现在我的dataset design有问题。。。
经过一番“折磨”。。。终于解决了。。。

但是,有遇到了另一个问题,就是无法update dataset
以下是我program要做的方法:

同一个dataset里,有3个table,
1个是table,给CR show out data的
2个是tableAdapter,从我SQL svr里面拉出来的table

我写了一个query,他成功通过了我的dataset在CR里显示出来了。。。
不过现在,我要把那些用query拉出来的data 储存进我的SQL table里面

于是,我就DS.Fill进了我tableAdapter里,也成功Fill进去了。。。
但是,当我去DS.Update时,却没有update到任何data 进我的SQL table里

以下是我的coding:

  1. Imports System
  2. Imports System.data.sqlclient
  3. Imports System.Data
  4. ------------------------------------------------------
  5. Public Class frmMPL
  6.     Inherits System.Windows.Forms.Form

  7. #Region " Windows Form Designer generated code "
  8. ------------------------------------------------------
  9.     Private Sub frmMPL_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  10.         Dim objConn As SqlConnection
  11.         Dim daT1 As SqlDataAdapter
  12.         Dim datTEMP As SqlDataAdapter
  13.         
  14.         Dim strConnection As String
  15.         Dim strSQL, ln_cd(10), sSQL As String
  16.         Dim i, k, m As Integer

  17.         strConnection = "User ID=" & Lid & " ;Password =" & Lpwd & " ;Persist Security Info=False;Initial Catalog=mrpdb_dom ;Data Source=store-svr"

  18.         objConn = New SqlConnection(strConnection)
  19.         i = 1
  20.         k = 1
  21.         For i = 1 To Max - 1
  22.             ln_cd(k) = "(line_mst.line_c = '" & l_cd(i) & "') AND (bom_mst.issue_dest = 'C&C') AND (mps_data.plan_qty <> '0') AND " & _
  23.                        "(LEFT(material_mst.material_kd, 1) <= 'A') AND (LEFT(mps_data.lot_no,2) = " & wk_no & ") OR " & _
  24.                        "(line_mst.line_c = '" & l_cd(i) & "') AND (bom_mst.issue_dest = 'C&C') AND (mps_data.plan_qty <> '0') AND (LEFT(mps_data.lot_no,2) = " & wk_no & ") AND " & _
  25.                        "(material_mst.material_kd = 'TER')"
  26.             k = k + 1
  27.         Next

  28.         m = 1
  29.         For m = 1 To k - 1
  30.             If m = 1 Then
  31.                 sSQL = ln_cd(m)
  32.             Else
  33.                 sSQL = sSQL + " OR " + ln_cd(m)
  34.             End If
  35.             m = m + 1
  36.         Next

  37.         strSQL = _
  38.         "SELECT DISTINCT " & _
  39.             "line_mst.line_c, line_mst.line_nm, bom_mst.material_no, bom_mst.bom_qty, material_mst.material_nm, material_mst.bag_qty, " & _
  40.             "material_mst.material_kd, mps_data.lot_no, proc_combi_mst.product_no, proc_combi_mst.cusdesch_c1, proc_combi_mst.cusdesch_c2, " & _
  41.             "proc_combi_mst.intdesch_c, mps_data.plan_qty " & _
  42.             "FROM ((((line_mst INNER JOIN " & _
  43.             "proc_combi_mst ON line_mst.line_c = proc_combi_mst.assy_line_c) INNER JOIN " & _
  44.             "bom_mst ON proc_combi_mst.product_no = bom_mst.product_no AND proc_combi_mst.cusdesch_c1 = bom_mst.cusdesch_c1 AND " & _
  45.             "proc_combi_mst.cusdesch_c2 = bom_mst.cusdesch_c2 AND proc_combi_mst.intdesch_c = bom_mst.intdesch_c) INNER JOIN " & _
  46.             "material_mst ON bom_mst.material_no = material_mst.material_no) INNER JOIN " & _
  47.             "mps_data ON proc_combi_mst.product_no = mps_data.product_no AND proc_combi_mst.cusdesch_c1 = mps_data.cusdesch_c1 AND " & _
  48.             "proc_combi_mst.cusdesch_c2 = mps_data.cusdesch_c2 AND proc_combi_mst.intdesch_c = mps_data.intdesch_c AND " & _
  49.             "line_mst.line_c = mps_data.line_c) " & _
  50.             "where " & sSQL & " ORDER BY material_mst.material_kd, bom_mst.material_no"


  51.         daT1 = New SqlDataAdapter(strSQL, objConn)
  52.         datTEMP = New SqlDataAdapter(strSQL, objConn)

  53.         Dim DS As New DataSet1
  54.         Dim DS2 As New DataSet1

  55.         ' Create command builder. This line automatically generates the
  56.         ' update commands for you, so you don't
  57.         ' have to provide or create your own.
  58.         Dim datTEMPCommandBuilder As SqlCommandBuilder = New SqlCommandBuilder(datTEMP)

  59.         ' Set the MissingSchemaAction property to AddWithKey because
  60.         ' Fill will not cause primary key & unique key information to
  61.         ' be retrieved unless AddWithKey is specified.
  62.         datTEMP.MissingSchemaAction = MissingSchemaAction.AddWithKey

  63.         datTEMP.Fill(DS, "MPLTemp")
  64.         datTEMP.Update(DS, "MPLTemp")

  65.         daT1.Fill(DS, "line_mst")

  66.         Dim test As New MatRpt1

  67.         test.SetDataSource(DS)
  68.         CrystalReportViewer1.ReportSource = test

  69.         objConn.Close()

  70.     End Sub

  71. End Class
复制代码


我的Dataset1

我是要update data回去我的MPLTemp的SQL table 里
以下是我跑program是检测到它有Fill到data进去


我找了一些资料,都说要assign一些parameter然后才可以update回去。。。
但是我不知道,我的data是query出来的。。。。
我要如何assign parameter给它update回去呢?
回复

使用道具 举报

发表于 3-4-2006 09:13 AM | 显示全部楼层
>datTEMP.Fill(DS, "MPLTemp")
>datTEMP.Update(DS, "MPLTemp")

不明白这连续的两行是为了什么呢?
回复

使用道具 举报

 楼主| 发表于 3-4-2006 12:04 PM | 显示全部楼层
原帖由 astral 于 3-4-2006 09:13 发表
>datTEMP.Fill(DS, "MPLTemp")
>datTEMP.Update(DS, "MPLTemp")

不明白这连续的两行是为了什么呢?


>datTEMP.Fill(DS, "MPLTemp")
这行是我把query出来的data, 放进我的DS里的"MPLTemp" table

>datTEMP.Update(DS, "MPLTemp")
这行是我要把data update 回去我SQL的MPLTemp table

这个MPLTemp table,是我直接从我的SQL拉出来,放在我的DS里。
也就是说,如果我在我的DS里要preview MPLTemp里面的data, 我是可以看到和在SQL里面一抹一样的data...
(希望我这样说,大家会明白吧?)
回复

使用道具 举报

发表于 3-4-2006 01:33 PM | 显示全部楼层
原帖由 johe07 于 3-4-2006 12:04 PM 发表


>datTEMP.Fill(DS, "MPLTemp")
这行是我把query出来的data, 放进我的DS里的"MPLTemp" table

>datTEMP.Update(DS, "MPLTemp")
这行是我要把data update 回去我SQL的 ...

你能不能messagebox.show列出你的update command的commandtext啊? 我想看看你的sqlcommandbuilder帮你弄出了什么update statement...
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 3-4-2006 01:51 PM | 显示全部楼层
原帖由 astral 于 3-4-2006 13:33 发表

你能不能messagebox.show列出你的update command的commandtext啊? 我想看看你的sqlcommandbuilder帮你弄出了什么update statement...


我没有update的command...
我上网找了几个例子, 都说,那个sqlcommandbuilder会自动帮我们create command...我们不用自己写。。。。所以,那些例子中,都没有show出,我们需要些什么command去update它。。。。

这就是我奇怪的一点。。。

我附上一个例子,我就是参考那样的做法。。。
可能我看错,或露了几个步骤,或许你们可以看得出来。。。

例子按这里
回复

使用道具 举报

发表于 3-4-2006 02:28 PM | 显示全部楼层
原帖由 johe07 于 3-4-2006 01:51 PM 发表


我没有update的command...
我上网找了几个例子, 都说,那个sqlcommandbuilder会自动帮我们create command...我们不用自己写。。。。所以,那些例子中,都没有show出,我们需要些什么command去update它。。 ...

对,它会根据你的SQLDataAdapter的SelectCommand来generate 其它的command.
不过是single table哦...
用这个列出你的update command来看看

Dim mysqlcmdbuilder As SqlClient.SqlCommandBuilder = New SqlClient.SqlCommandBuilder(SqlDataAdapter1)
        MessageBox.Show(mysqlcmdbuilder.GetUpdateCommand.CommandText)
回复

使用道具 举报

 楼主| 发表于 3-4-2006 03:11 PM | 显示全部楼层
原帖由 astral 于 3-4-2006 14:28 发表

对,它会根据你的SQLDataAdapter的SelectCommand来generate 其它的command.
不过是single table哦...
用这个列出你的update command来看看

Dim mysqlcmdbuilder As SqlClient.SqlCommandBuilder = New SqlC ...

你是说,在我的.Update(DS,"xxxx") 之后,放这个message box?
回复

使用道具 举报

发表于 3-4-2006 03:15 PM | 显示全部楼层
原帖由 johe07 于 3-4-2006 03:11 PM 发表

你是说,在我的.Update(DS,"xxxx") 之后,放这个message box?

不是...是在你用了sqlcommandbuilder过后,show那个commandbuilder里的updatecommand来看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 23-9-2024 09:26 PM , Processed in 0.140386 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表