做过无限数据库设计的进来看看··
现在急需一个无限商品类别数据库设计 包括插入删除 修改 和显示操作··麻烦高人们帮帮忙·· 发个实例给我· · 急啊· · · 能不能做过这星期就靠这个东西了··
网上找了很多资料· · 可惜菜· 看的不是很懂 而且这方面全的资料也少· ·· 麻烦大家啦···
现在可以用的分不多啦· · 希望大家帮帮忙·· --------------------编程问答-------------------- 忘记了 发到我邮箱 麻烦了 bingsueiliuhen2@163.com --------------------编程问答-------------------- 软件开发是要自己动脑子的,这方面资料很多,看不大懂就是你自己的问题了 --------------------编程问答-------------------- 偶还是刚刚学·· 我看了2个星期了· ·· --------------------编程问答-------------------- public void loadtree(System.Windows.Forms.TreeView tree)
{
SystemDataAccess sda = new SystemDataAccess();
System.Windows.Forms.TreeNode RootNode = new TreeNode();
tree.Nodes.Clear();
tree.Nodes.Add(addNots("Root", "工序库", 0, RootNode));
//tree.ExpandAll();
}//加载工序库tree
public System.Windows.Forms.TreeNode addNots(string Name, String NodeName, int Tab, System.Windows.Forms.TreeNode RootNode)
{
SystemDataAccess sda = new SystemDataAccess();
string depstr = "select StepCode as 工序库编码 ,StepName as 工序库名称 ,PreStep as 所属上级工序库编码 from M_Steps where PreStep='" + Name.Trim() + "'";
DataTable table = new DataTable();
System.Data.SqlClient.SqlConnection sqlcon = new System.Data.SqlClient.SqlConnection();
sqlcon.ConnectionString = sda.getConStr();
System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(depstr, sqlcon);
da.Fill(table);
System.Windows.Forms.TreeNode nodenew = new TreeNode(NodeName);
nodenew.Name = Name;
for (int i = 0; i <= table.Rows.Count - 1; i++)
{
Tab++;
string tempa = table.Rows[i][0].ToString().Trim();
string tempb = table.Rows[i][1].ToString().Trim();
//nodenew.Nodes[nodenew.Nodes.Count].Name = tempa;
nodenew.Nodes.Add(addNots(tempa, tempb, Tab, RootNode));
Tab--;
}
table.Clear();
return nodenew;
}//递归加载树tree --------------------编程问答-------------------- public System.Windows.Forms.TreeNode addNots(string Name, String NodeName, int Tab, System.Windows.Forms.TreeNode RootNode)
{
SystemDataAccess sda = new SystemDataAccess();
string depstr = "select StepCode as 工序库编码 ,StepName as 工序库名称 ,PreStep as 所属上级工序库编码 from M_Steps where PreStep='" + Name.Trim() + "'";
DataTable table = new DataTable();
System.Data.SqlClient.SqlConnection sqlcon = new System.Data.SqlClient.SqlConnection();
sqlcon.ConnectionString = sda.getConStr();
System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(depstr, sqlcon);
da.Fill(table);
System.Windows.Forms.TreeNode nodenew = new TreeNode(NodeName);
nodenew.Name = Name;
for (int i = 0; i <= table.Rows.Count - 1; i++)
{
Tab++;
string tempa = table.Rows[i][0].ToString().Trim();
string tempb = table.Rows[i][1].ToString().Trim();
//nodenew.Nodes[nodenew.Nodes.Count].Name = tempa;
nodenew.Nodes.Add(addNots(tempa, tempb, Tab, RootNode));
Tab--;
}
table.Clear();
return nodenew;
}//递归加载树tree
public void loadtree(System.Windows.Forms.TreeView tree)
{
SystemDataAccess sda = new SystemDataAccess();
System.Windows.Forms.TreeNode RootNode = new TreeNode();
tree.Nodes.Clear();
tree.Nodes.Add(addNots("Root", "工序库", 0, RootNode));
//tree.ExpandAll();
}//加载工序库tree --------------------编程问答-------------------- 给你两个思路:
1、子父节点
举个列子
节点表(节点编号,父节点编号,名称)
2、编号001002
举个例子
节点表(节点编号,节点名称)
001,服装
001001,上衣
001002,裤子
001001001,长袖
001001002,短袖 --------------------编程问答-------------------- 就是插入数据(产品类别,单不是以级类别的时候)的时候不知道怎么弄·· --------------------编程问答-------------------- 我就用的是virusplayer的方法2. --------------------编程问答-------------------- virusplayer 2、编号001002 后台插入数据这样插 --------------------编程问答-------------------- virusplayer 2、编号001002 后台插入数据怎样插 --------------------编程问答--------------------
我的例子是绝可以实现无限类别的.不要浮躁,好好看.应该可以帮到你.
--------------------编程问答--------------------
//数据库的连接
public static OleDbConnection DBConn()
{
return new OleDbConnection(System.Web.Configuration.WebConfigurationManager.ConnectionStrings["ConnectionString"].ToString());
}
//从数据库初始化控件treeView
public static void treeViewInit(TreeView treeView1)
{
using (OleDbConnection conn = DBConn())
{
conn.Open();
OleDbCommand cmd = new OleDbCommand("select * from nodes", conn);
OleDbDataReader oleReader = cmd.ExecuteReader();
while (oleReader.Read())
{
string[] nodes = oleReader["nodeName"].ToString().Split('/');
string nodeID = oleReader["nodeID"].ToString();
TreeNode curNode= new TreeNode();//当前结点
for (int i = 0; i < nodes.Length; i++)
{
if (i == 0)
{
bool addNode = true;
for (int j = 0; j < treeView1.Nodes.Count; j++)
{
if (nodes[0] == treeView1.Nodes[j].Text)
{
curNode = treeView1.Nodes[j];//设为当前结点
addNode = false;
break;
}
}
if (addNode == true)
{
TreeNode tempNode = new TreeNode(nodes[0]);
treeView1.Nodes.Add(tempNode);
curNode = tempNode;//设为当前结点
}
}
else
{
bool addNode = true;
for (int k = 0; k < curNode.ChildNodes.Count; k++)
{
if (nodes[i] == curNode.ChildNodes[k].Text)
{
addNode = false;
curNode = curNode.ChildNodes[k];//设为当前节点
break;
}
}
if (addNode == true)
{
TreeNode tempNode = new TreeNode(nodes[i]);
curNode.ChildNodes.Add(tempNode);
curNode = tempNode;//设为当前结点
}
}
}
curNode.Value = "类" + nodeID;//设置属性
}
}
}
数据库中的的表是如下结构.
表nodes 就只有两个字段
nodeID int类型
nodeName 长符串就可以.
nodeID nodeName
1 合作伙伴
2 兴安县
3 兴安县/兴安镇
4 灵桂县
5 桂林市
6 公司客户登记表
7 公司客户登记表/余波
8 公司客户登记表/欧阳
9 公司客户登记表/谢金海
10 东北地区
11 西北地区
12 西南地区
13 桂林市/七星区
14 学习
15 中国
16 西北地区/广东
17 东北地区/黑龙江
18 东北地区/北京
19 中国/广西
分隔用/ --------------------编程问答--------------------
QQ:103884244
需要的话加我QQ.帮你实现. --------------------编程问答-------------------- 不能沉啊 ··· --------------------编程问答-------------------- 比如说父类的ID是001,把父类的ID 001取过来,然后加上自己的001,不就成了001001了吗 --------------------编程问答-------------------- 001~999还是有限的。。。 --------------------编程问答-------------------- <style>
body,td,th
{
font-size:12px;
vertical-align:top;
}
th
{
layout-flow:vertical-ideographic ;
}
</style>
<TABLE border=1>
<TR>
<TD colspan=3 align=center>两种树型结构SQL的对比.htm</TD>
</TR>
<TR>
<TH>名称</TH>
<TD>方法1:父子结构Tree1表</TD>
<TD>方法2:编码结构Tree2表</TD>
</TR>
<TR>
<TH>数据形式</TH>
<TD>
<xmp>
id pId content
--------------------------------------
1 0 节点
2 0 节点
...
11 1 节点
...
21 2 节点
...
121 12 节点
...
1110 110 节点
</xmp>
</TD>
<TD>
<xmp>
id nodeCode content
--------------------------------------
1 001 节点
2 002 节点
...
11 001001 节点
...
112 001001002 节点
...
1104 010010004 节点
...
</xmp>
</TD>
</TR>
<TR>
<TH>建表语句</TH>
<TD>
<xmp>
CREATE TABLE [dbo].[Tree1] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[pId] [int] NULL ,
[content] [varchar] (10) NULL
) ON [PRIMARY]
</xmp>
</TD>
<TD>
<xmp>
CREATE TABLE [dbo].[Tree2] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[nodeCode] [varchar] (120) NOT NULL ,
[content] [varchar] (10) NULL
) ON [PRIMARY]
</xmp>
</TD>
</TR>
<TR>
<TH>插入数据10+100+1000条,深度3,广度10</TH>
<TD>
<xmp>--truncate table Tree1
declare @E int--广度循环变量
declare @EE int--广度循环变量
declare @EEE int--广度循环变量
declare @pId int--父id
declare @content varchar(10)
set @content='节点'
--添加第1层10个节点
set @E=1
while @E<=10
begin
set @pId=0
insert tree1(pId,content) values(@pId,@content)
set @E=@E+1
end
--添加第2层100个节点
set @E=1
while @E<=10
begin
set @EE=1
while @EE<=10
begin
set @pId=@E
insert tree1(pId,content) values(@pId,@content)
set @EE=@EE+1
end
set @E=@E+1
end
--添加第3层1000个节点
set @E=1
while @E<=10
begin
set @EE=1
while @EE<=10
begin
set @EEE=1
while @EEE<=10
begin
set @pId=@E*10 + @EE
insert tree1(pId,content) values(@pId,@content)
set @EEE=@EEE+1
end
set @EE=@EE+1
end
set @E=@E+1
end
--select count(*) from tree1</xmp>
</TD>
<TD>
<xmp>--truncate table Tree2
declare @nodeCode varchar(30)
declare @content varchar(10)
declare @E int--广度循环变量
declare @EE int--广度循环变量
declare @EEE int--广度循环变量
set @content='节点'
--添加第1层10个节点
set @E=1
while @E<= 10
begin
set @nodeCode =right(rtrim(str(1000 + @E)),3)
insert Tree2(nodeCode,content) values(@nodeCode,@content)
set @E=@E+1
end
--添加第2层100个节点
set @E=1
while @E<= 10
begin
set @EE=1
while @EE<= 10
begin
set @nodeCode =right(rtrim(str(1000 + @E)),3)
set @nodeCode =@nodeCode + right(rtrim(str(1000 + @EE)),3)
insert Tree2(nodeCode,content) values(@nodeCode,@content)
set @EE=@EE+1
end
set @E=@E+1
end
--添加第3层1000个节点
set @E=1
while @E<= 10
begin
set @EE=1
while @EE<= 10
begin
set @EEE=1
while @EEE<= 10
begin
set @nodeCode =right(rtrim(str(1000 + @E)),3)
set @nodeCode =@nodeCode + right(rtrim(str(1000 + @EEE)),3)
insert Tree2(nodeCode,content) values(@nodeCode,@content)
set @EEE=@EEE+1
end
set @EE=@EE+1
end
set @E=@E+1
end
select count(*) from tree2</xmp>
</TD>
</TR>
<TR>
<TH>得到节点深度和排序的办法</TH>
<TD>
<xmp>
用函数,本例是邹建写的,效率比较高。
create function get_Deep_tree1()
returns @re table([id] int,[level] int,sid varchar(8000))
as
begin
declare @l int
set @l=0
insert @re select [id],@l,right(10000+[id],4)
from [tree1] where [pid]=0
while @@rowcount>0
begin
set @l=@l+1
insert @re select a.[id],@l,b.sid+right(10000+a.[id],4)
from [tree1] a,@re b
where a.[pid]=b.[id] and b.[level]=@l-1
end
return
end
go
</xmp>
</TD>
<TD>
<xmp>
节点深度就是编码长度/3
len(nodeCode)/3
排序只要order by nodeCode asc就可以得到
web叶面需要的
</xmp>
</TD>
</TR>
<TH>查询排序</TH>
<TD>
<xmp>
select a.id,a.content,b.[level]+1 深度
from [tree1] a,get_Deep_tree1() b
where a.[id]=b.[id]
order by b.sid
</xmp>
</TD>
<TD>
<xmp>select *,len(nodeCode)/3 深度 from tree2 order by nodeCode asc
</xmp>
</TD>
</TR>
<TR>
<TH>排序结果</TH>
<TD>
<xmp>
id content 深度
1 节点 1
11 节点 2
111 节点 3
..
120 节点 3
12 节点 2
...
1072 节点 3
</xmp>
</TD>
<TD>
<xmp>id nodeCode content 深度
1 001 节点 1
11 001001 节点 2
111 001001001 节点 3
...
210 001010010 节点 3
2 002 节点 1
21 002001 节点 2
211 002001001 节点 3
...
1088 010008008 节点 3
...
1101 010010001 节点 3
</xmp>
</TD>
</TR>
<TR>
<TH>查询时间</TH>
<TD>
<xmp>
30毫秒左右
</xmp>
</TD>
<TD>
<xmp>15毫秒左右
</xmp>
</TD>
</TR>
</TABLE>
补充:.NET技术 , ASP.NET