sql server初学者 对uniqueidentifier数据类型的主键设置问题

zhuminnick 2005-08-26 04:13:25
各位大虾,我是sql server的初学者。我在vb.net编程中提示无法找到主键,我猜想想可能是我表中主键没有设置好,(但也可能是代码问题)比如

说如果主键数据类型为int,我可以把主键的标识选项改为“是”,那么该主键可以自动编号。但该主键是uniqueidentifier类型,请哪位根据

我所写的存储过程和程序看看,该主键应该怎么设置,谢谢。

1、出错提示:
过程 'sp_Products_SEL_byCategoryID' 需要参数 '@chrCategoryID',但未提供该参数。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.SqlClient.SqlException: 过程 'sp_Products_SEL_byCategoryID' 需要参数 '@chrCategoryID',但未提供该参

数。

源错误:


行 34: sqlcmdSelectProducts.Connection = sqlconEBuyAdventure
行 35: Dim sqladpProducts As New SqlDataAdapter(sqlcmdSelectProducts)
行 36: sqladpProducts.Fill(dsproducts, "Products")
行 37: Return dsproducts
行 38: End Function

2、sql server的两个表 :
表一:ProductCategories
里面有三项: ProductCategoryID,ProductID,CategoryID (数据类型全为uniqueidentifier)

表二:Products
里面主键项为:ProductID (数据类型为: uniqueidentifier 16)


3、存储过程:
ALTER PROCEDURE sp_Products_SEL_byCategoryID
@chrCategoryID char(38)
AS
SELECT
Products.ProductID,
Products.SKU,
Products.ProductType,
Products.ProductDate,
Products.ProductName,
Products.Description,
Products.ProductSize,
Products.ImageURL,
Products.UnitPrice,
Products.Onsale
FROM Products,ProductCategories
WHERE Products.ProductID=ProductCategories.ProductID
AND ProductCategories.CategoryID=@chrCategoryID
return 1

4、页面调用代码(是一个简单的通过datalist调用显示数据库程序)
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim objCatagoriesDataset As DataSet
Dim strCategoryID As String = Request.Params("CategoryID")
Dim CategoryName As String
Dim objCatalog As New EBuyComm.Services.Categories
objCatagoriesDataset = New EBuyComm.dsProducts
objCatagoriesDataset = objCatalog.GetProducts(strCategoryID)
If objCatagoriesDataset.Tables("products").Rows.Count > 0 Then
CategoryName = objCatagoriesDataset.Tables("products").Rows.Item(0)("productType")
lblCategoryName.Text = "Category:" & CategoryName
End If
dlstProducts.DataSource = objCatalog.GetProducts(strCategoryID)
dlstProducts.DataBind()
End Sub

5、页面调用代码4种objCatalog.GetProducts(strCategoryID)中的getproducts类
Public Function GetProducts(ByVal strCategoryID As String) As dsProducts
Dim sqlcmdSelectProducts As New SqlCommand("sp_Products_SEL_byCategoryID")
With sqlcmdSelectProducts
.CommandType = CommandType.StoredProcedure
With .Parameters
.Add("@chrCategoryID", SqlDbType.Char, 38)
.Item("@chrCategoryID").Value = strCategoryID
End With
End With
Dim dsproducts As New dsProducts
Dim sqlconEBuyAdventure As New SqlConnection(connstring)
sqlcmdSelectProducts.Connection = sqlconEBuyAdventure
Dim sqladpProducts As New SqlDataAdapter(sqlcmdSelectProducts)
sqladpProducts.Fill(dsproducts, "Products")
Return dsproducts
End Function

...全文
419 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuminnick 2005-09-01
  • 打赏
  • 举报
回复
呵呵,谢谢MorningTea(一勺抹茶) 的耐心,我已经把这个问题按照你的提示给解决了:)
要是你有时间,请到http://community.csdn.net/Expert/topic/4233/4233592.xml?temp=.7544214
随便说句话,我把这个页面的分数全给你
zhuminnick 2005-09-01
  • 打赏
  • 举报
回复
谢谢MorningTea(一勺抹茶) ,你还真是有耐心,我在其他版面也发了这个问题,人家都不愿意看(嫌太长了)
我已经把这个问题按照你的提示解决了。
你要有时间你来这个页面随便说句话吧,我把该页面的分全给你
http://community.csdn.net/Expert/topic/4233/4233592.xml?temp=.7544214
MorningTea 2005-08-29
  • 打赏
  • 举报
回复
不是,我意思是说是因为你传入变量没有实际传入,实际传入是null值

你不是说Request.Params("CategoryID")中传的是空值。--那么你要找到为什么是null值

zhuminnick 2005-08-28
  • 打赏
  • 举报
回复
我觉得不一定是页面问题吧,以前我用int设置主键的时候也出现过null值的错误,我也一直以为是代码问题,结果后面发现是我的sql server表中int的标志应该改为是,这样主键就可以自动编号增长.并非
是代码出错获取不到值,而是表设计出错导致代码获取不到值
zhuminnick 2005-08-28
  • 打赏
  • 举报
回复
up
zhuminnick 2005-08-27
  • 打赏
  • 举报
回复
唉,我把sp取消了,Request.Params("CategoryID")中传的是空值。
但我更加糊涂了,不知道到底是存储过程没写好,或者是数据库的数据属性没设置好,还是
我的代码问题
MorningTea 2005-08-27
  • 打赏
  • 举报
回复
Request.Params("CategoryID")中传的是空值。问题就是出在这里,传入参数不能传入null值

要在页面里面查找
zhuminnick 2005-08-27
  • 打赏
  • 举报
回复
up
MorningTea 2005-08-26
  • 打赏
  • 举报
回复
categoryid为空当然不行,你前面的错误就是没有赋值,所以报错?我只是告诉你错误的原因

我看错了,以为你要维护表,你的SP只是SELECT而已,那你先不要调用SP,你先看看到底抓取出来的 strCategoryID 是否是空的,也就是没有Request.Params("CategoryID"),否则不会出问题啊


zhuminnick 2005-08-26
  • 打赏
  • 举报
回复
1、这个categoryid是主键,为空的话不行吧?而且我在:( 4、页面调用代码)中已经有程序去获取由newid生成的序列号了。
Dim strCategoryID As String = Request.Params("CategoryID")

2、WHERE Products.ProductID=ProductCategories.ProductID
该存储过程中的条件语句是不是得两个表都建立关联?我在数据关系图中建立了关联,但是,
由于Products,ProductCategories的属性都是uniqueidentifier,如果我都用NEWID()
,那不是两个表中的productID都是自动随机生成的?那么当然
(WHERE Products.ProductID=ProductCategories.ProductID)不能相等
可不可能是由于这个的原因而导致我的出错呢?

3、上文 ( 3、存储过程:)中的return 1具体是怎么个用法?我不知道我用对了没有?
MorningTea 2005-08-26
  • 打赏
  • 举报
回复
---可以,但是你传入''会不会达不到你要的效果,你这个参数是什么,总有个具体值传入,否则查到的结果是ProductCategories.CategoryID=‘’的纪录

---NEWID()?这里不罗索,你看看这篇文章
CSDN技术中心 Sql Server:理解uniqueidentifier类型和NEWID()
url:http://dev.csdn.net/article/43/43255.shtm

zhuminnick 2005-08-26
  • 打赏
  • 举报
回复
MorningTea(一勺抹茶) ,你的意思是说
1、我在存储过程ALTER PROCEDURE sp_Products_SEL_byCategoryID应该给一个初值?
改为@chrCategoryID char(38)=''这样就可以了是吗?
2、我应该在主键中选择newid()?但是具体怎么设置?只要选择了newid()就可以了吗?
呵呵,不好意思,因为newid()我不知道是什么个东东。
MorningTea 2005-08-26
  • 打赏
  • 举报
回复
1。 你的sp_Products_SEL_byCategoryID 需要传入一个参数@chrCategoryID,你必须提供,你没有设置默认值就会有问题,如果你的建立sp为:
ALTER PROCEDURE sp_Products_SEL_byCategoryID
@chrCategoryID char(38)=''
AS
sp_Products_SEL_byCategoryID
....
那么你不设置,就不会问你,不会报错

2。说如果主键数据类型为int,我可以把主键的标识选项改为“是”,那么该主键可以自动编号。但该主键是uniqueidentifier类型,

---uniqueidentifier可以自己输入,但是你能保证绝对不重复吗?所以你要用newid()

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧