-1

我有一个这样的sql数据

1 2m
2 3m
3 3m
6 6m
7 6m

我想将其导出并显示到 datagridview 中。

1 2m
2 3m
3 3m
4 0m
5 0m
6 6m
7 6m

这是我的代码:

private void laygio(string tenstore, string tenxuat)
{
    string conn = "Data Source=USER-PC;Initial Catalog=NCKHmoi;Integrated Security=True";
    SqlConnection connect = new SqlConnection(conn);
    SqlCommand command = new SqlCommand();
    command.Connection = connect;
    connect.Open();
    int stday = Convert.ToInt32(dst.Text);
    int stmonth = Convert.ToInt32(mst.Text);
    int styear = Convert.ToInt32(yst.Text);
    int sthour = Convert.ToInt32(hst.Text);
    int stminute = 0;
    int stsecond = 0;
    int eday = Convert.ToInt32(ded.Text);
    int emonth = Convert.ToInt32(med.Text);
    int eyear = Convert.ToInt32(yed.Text);
    int ehour = Convert.ToInt32(hed.Text);
    int eminute = 0;
    int esecond = 0;
    DateTime startday = new DateTime(styear, stmonth, stday, sthour, stminute, stsecond);
    DateTime endday = new DateTime(eyear, emonth, eday, ehour, eminute, esecond);
    DataTable tbl = new DataTable();
    DataColumn Col = new DataColumn("Thời gian", typeof(int));
    tbl.Columns.Add(Col);
    SqlDataAdapter adapter = new SqlDataAdapter();
    int i = 1;
    for (DateTime xday = startday; xday <= endday; xday += TimeSpan.FromHours(1))
    {
        int ngay = Convert.ToInt32(xday.Day.ToString());
        int thang = Convert.ToInt32(xday.Month.ToString());
        int nam = Convert.ToInt32(xday.Year.ToString());
        int gio = Convert.ToInt32(xday.Hour.ToString());
        command.CommandType = CommandType.Text;
        command.CommandText = @"Select SoLieuGio.LLNuoc from SoLieuGio where SoLieuGio.GioID= (select Gio.GioID from Gio where (Gio.Gio = @Gio and Gio.NgayID= (select Ngay.NgayID from Ngay where (Ngay.Ngay=@Ngay and Ngay.ThangID= (select Thang.ThangID from Thang where (Thang.Thang = @Thang and Thang.NamID=(select Nam.NamID from Nam where  (Nam.Nam = @Nam and Nam.TramID=(select Tram.TramID from Tram Where (Tram.TenTram like @TenTram and Tram.TinhID=(select Tinh.TinhID from Tinh where  (Tinh.TenTinh like @TenTinh and Tinh.KhuVucID=(select KhuVuc.KhuVucID from KhuVuc where KhuVuc.Ten=@Ten)))))))))))))";
        command.Parameters.Add("@Gio", SqlDbType.BigInt).Value = gio;
        command.Parameters.Add("@Ngay", SqlDbType.BigInt).Value = ngay;
        command.Parameters.Add("@Thang", SqlDbType.BigInt).Value = thang;
        command.Parameters.Add("@Nam", SqlDbType.BigInt).Value = nam;
        command.Parameters.Add("@Ten", SqlDbType.NVarChar, 50).Value = "Đồng Bằng Bắc Bộ";
        command.Parameters.Add("@TenTinh", SqlDbType.NVarChar, 50).Value = TinhComboBoxEx.Text;
        command.Parameters.Add("@TenTram", SqlDbType.NVarChar, 50).Value = TramComboBoxEx.Text;
        adapter.SelectCommand = command;
        adapter.Fill(tbl);
        dataGridView2.DataSource = tbl;            
        command.Parameters.Clear();
    }
    command.Dispose();
    connect.Close();
}

该代码的结果是:

1 2 米 2 3 米 3 3 米 6 6 米 7 6 米

我需要修复什么才能从 1 到 7 完全显示它。

4

3 回答 3

2

您可以使用计数表master..spt_values来处理系列中缺失的项目。

您可以通过左连接到您的表格并合并您的价值观来做到这一点。

例如

CREATE TABLE ATable
    ([Number] int, [value] varchar(2))
;

INSERT INTO ATable
    ([Number], [value])
VALUES
    (1, '2m'),
    (2, '3m'),
    (3, '3m'),
    (6, '6m'),
    (7, '6m')
;

这个

SELECT
  v.Number,
  COALESCE(ATable.Value, '0m') Value
FROM
  master..spt_values  v
  LEFT JOIN ATable
  ON v.Number = ATable.Number
WHERE
  v.Type = 'P'
  and v.Number > 0 and v.Number < 8

会产生这个值

| NUMBER | VALUE |
------------------
|      1 |    2m |
|      2 |    3m |
|      3 |    3m |
|      4 |    0m |
|      5 |    0m |
|      6 |    6m |
|      7 |    6m |

演示

于 2013-04-17T14:30:26.197 回答
0

尝试创建一个包含缺失值的临时表,然后连接主表和临时表。

这就是它的样子

create table #temp1
(
    ID int identity(1,1),
    M varchar(4)
)
declare @count int
SET @count = 0

declare @max int
SET @max = 20

while @count < @max
begin
insert into #temp1 (M) values ('0m') 
SET @count = @count + 1
end

select * from #temp1

select (case M1.ID when null then T1.ID else M1.ID) as ID,
(case M1.M when null then T1.M else M1.ID) as TXT
from MainTable M1
join #temp1 T1
order by ID
于 2013-04-17T09:08:55.107 回答
0

在这种情况下,我认为最简单的方法是每次检查当前值是否是前一个值 + 1 的总和

if (current != (previous + 1)
{
    //make new 4 0m or something
}
else
{
    //continue reading
}
于 2013-04-17T06:38:21.653 回答