中国虚拟军事网(VME)- 专注于武装突袭系列虚拟军事游戏

 找回密码
 加入VME

QQ登录

只需一步,快速开始

搜索
查看: 1690|回复: 8

又要求助各位一个C#编程的问题

[复制链接]
发表于 2015-7-28 12:25:29 来自手机 | 显示全部楼层 |阅读模式
最近又做了一个项目,其中有一个功能是利用G
ridView做个采购列表,一个是手动添加型的,另一个是根据订单与产品信息自动生成的,两种表中都有checkbox用来选择要采购哪个产品,然后点击生成采购单按钮生成选择的要生产的物件的采购单,其中手动那个没有问题,自动生成那个因为GridView中引用了两个表的数据,在采购单生成功能按钮那里的代码一直出错,查了许多资料也尝试了很多写法但都不行,贴上出错的代码希望大家给点指点或思路
手动填写采购单页面相关功能的代码(未出错)
public DataTable BuyManagerSelectByID(string   id)
{
string sql="select*from dbo.buymanager where ID in ("+id+") order by ID desc";
try
{
  return data.RunProcReturn(sql);
}
catch(Exception ee)
{
  data.MessageBox(ee.Message.ToString());
  return null;
}
}
自动生成采购单列表的相关代码(出错)
public DataTable GVAUTO(string Pnum)
{
string sql="select*from dbo.productInfo and dbo.orderInfo where Pnum in ("+Pnum+") order by Pnum desc";//出错 关键字“and”附近有语法错误;and去了依然报错,列名Pnum不明确
下面的就跟上面的一样了
……
}
希望各位能看一下,给个解决问题的办法或思路
发表于 2015-7-28 14:33:23 | 显示全部楼层
什么叫 select*from dbo.productInfo and dbo.orderInfo ?and是满足同时两个条件,但是不能让你同时搜索两个表。你需要两个表的信息必须先join,然后再选择。

题外话,
你的这个问题根本不是C#,这是SQL问题。从你这个问题来看,我疑惑你到底懂不懂SQL语言?如果不懂你先补习一下SQL相关的知识。SQL虽然语法上非常好理解,很多人觉得随便看看网上范例就可以用,但是如果不懂数据库的一些基本常识,不但会制造大量冗余繁琐而且相互不符的数据,还会导致各种风险。比如说我就怀疑你的pnum是不是产品编号,如果是,说明你可能另有产品ID,产品ID如果是程序用的GUID就算了,如果不是GUID嘛,呵呵。。。

随便看看就看出几个毛病
1,用string生成SQL虽然看似常见,但是使用是有范畴的,如果用户填写数据可能进入到SQL命令的必须用Stored Procedure 或者Linq Query之类的形式对数据和SQL命令进行隔离,否则就会留下给黑客Injection攻击的可能。
2,单对单的选择条件,是不需要用 select ... where ... in (xx,xx),而是应该用 select ... where xx=xx。
3,pnum这种意义不明的词用在数据库里,只能制造大量麻烦。设计数据库是非常重要的活,命名必须明确。

最后,你本地有数据库的拷贝吧?不至于直接连到live数据库吧?以后有这种问题先用SQL跑一遍看看你SQL命令有没有问题。
 楼主| 发表于 2015-7-28 15:16:54 来自手机 | 显示全部楼层
cycle6 发表于 2015-7-28 14:33
什么叫 select*from dbo.productInfo and dbo.orderInfo ?and是满足同时两个条件,但是不能让你同时搜索两 ...

多谢前辈指教,其实我大学里学的是过程自动化,主要就是搞PLC的,然而今年毕业时找工作时发现这方面的人,但却面试上了软件开发,所以我现在也是边学边做,至于SQL的join的方法,那个自动生成表里的数据就是用的left join方法把两个表的数据放进一个GV里,DataKey用的就是Pnum,看您的说法,join的用法应该跟left join的方法类似吧
发表于 2015-7-28 16:48:19 | 显示全部楼层
ZWB 发表于 2015-7-28 15:16
多谢前辈指教,其实我大学里学的是过程自动化,主要就是搞PLC的,然而今年毕业时找工作时发现这方面的人 ...


大体上可以这么说,但是left join,right join,inner join,outer join,各有不同的用法。用什么join一定要看你需求什么。你这个我估计只用left join就可以。

SELECT *
FROM orderInfo
LEFT JOIN productInfo
ON orderInfo.pnum=productInfo.pnum
ORDER BY orderInfo.pnum desc //我是不明白你order by pnum有什么意义。一般都是order by xx.name或者xx.date

但是这里有个问题,一般下order都可以有好多个商品,你们是一个order只对应一个商品,还是一个order对应客户当时下订单时候的全部商品?如果是后者,很可能要三个table join。

SQL本身是很深奥的东西,你这样一个一个问不太好搞懂,我们给你讲也可能误导你。不如去找本书或者网上视频教程,有系统的去学一下,然后有零星问题给你解决一下。

PS: 看来我估计对了?pnum是product number的意思?果真如此的话,设计这种数据库的人应该剁手。
 楼主| 发表于 2015-7-28 22:58:30 来自手机 | 显示全部楼层
cycle6 发表于 2015-7-28 16:48
大体上可以这么说,但是left join,right join,inner join,outer join,各有不同的用法。用什么join ...

多谢前辈
 楼主| 发表于 2015-7-29 10:32:57 来自手机 | 显示全部楼层
cycle6 发表于 2015-7-28 16:48
大体上可以这么说,但是left join,right join,inner join,outer join,各有不同的用法。用什么join ...

功能可以实现了,我是这样写的
string sql="select*from orferInfo left join productInfo on orderInfo.Pnum=productInfo.Pnum where productInfo.Pnum in ("+Pnum+") order by orderInfo.Pnum desc";
非常感谢前辈的指点,接下来我会尽量抽时间学习SQL并巩固C#的,因为接下来我就要搞建模了#皿#
发表于 2015-7-29 23:58:25 | 显示全部楼层
ZWB 发表于 2015-7-29 10:32
功能可以实现了,我是这样写的
string sql="select*from orferInfo left join productInfo on orderInfo ...

建模不是3D之类的技术么 跟C#啥关联?
 楼主| 发表于 2015-7-30 08:33:04 来自手机 | 显示全部楼层
cycle6 发表于 2015-7-29 23:58
建模不是3D之类的技术么 跟C#啥关联?

因为搞建模的大手子突然走廊,暂时还没招来人,所以先让我顶上补充个人手,但我会个卵啊,所以就要赶紧学嘛,并且他们模型建好后也要写一些相关程序的
发表于 2015-7-30 13:54:33 | 显示全部楼层
ZWB 发表于 2015-7-30 08:33
因为搞建模的大手子突然走廊,暂时还没招来人,所以先让我顶上补充个人手,但我会个卵啊,所以就要赶紧学 ...

哦 古德...
您需要登录后才可以回帖 登录 | 加入VME

本版积分规则

小黑屋|中国虚拟军事网

GMT+8, 2024-4-19 16:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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