2013-05-24 2 views
0

В моем проекте я отправляю некоторые файлы SQL Server, когда файлы, загруженные в таблице Table1 другая функция будет проверять, что таблица Table1 для файлов и вставляет случайный номер или Символы в таблице Table2 путем получения случайных чисел или символов из другой функции, которая генерирует и возвращает его в виде строки, теперь моя проблема заключается в том, что файлы правильно Загрузка и сохранение в Table1 но когда Table1 вставлен записывает другую функцию, которая вставляет случайные числа/символ, но бросает Exception My Code,Индекс находился вне границ массива

public class Upload : IHttpHandler { 

public void ProcessRequest (HttpContext context) { 
    context.Response.ContentType = "text/plain"; 
    context.Response.Expires = -1; 

    try 
    { 
     HttpPostedFile postedFile = context.Request.Files["Filedata"]; 

     string savepath = ""; 
     string tempPath = ""; 
     tempPath = System.Configuration.ConfigurationManager.AppSettings["FolderPath"]; 
     savepath = context.Server.MapPath(tempPath); 
     string filename = postedFile.FileName; 
     string ext = Path.GetExtension(filename); 
     string contenttype = String.Empty; 
     switch (ext) 
     { 

      case ".doc": 

       contenttype = "application/vnd.ms-word"; 

       break; 
      case ".docx": 

       contenttype = "application/vnd.ms-word"; 

       break; 

      case ".pdf": 

       contenttype = "application/pdf"; 

       break; 

     } 

     context.Response.StatusCode = 200; 
     byte[] b = ReadFile(postedFile); 
     ExamManagement.SP.QUESTIONPAPER_SP_UPLOAD(filename, contenttype,b).Execute(); 
     trigger(); 

    } 

    catch (SqlException exp) 
    { 
     if (exp.Message.Contains("PK_answerkey")) 
     { 
      context.Response.Write("File Already Uploaded....."); 
     } 
    } 
    catch (Exception ex) 
    { 
     context.Response.Write("Error: " + ex.Message); 
    } 


} 

public bool IsReusable { 
    get { 
     return false; 
    } 
} 
private byte[] ReadFile(HttpPostedFile fObj2) 
{ 
    byte[] data = new Byte[fObj2.ContentLength]; 
    fObj2.InputStream.Read(data, 0, fObj2.ContentLength); 
    return data; 
} 
protected void ClientMessaging(string msg) 
{ 
    String script = String.Format("alert('{0}');", msg); 
    Anthem.Manager.IncludePageScripts = true; 

} 
protected void trigger() 
{ 
    try 
    { 
     DataSet ds = ExamManagement.SP.Questionpaper_SP_Selectall().GetDataSet(); 
     if (ds.Tables[0].Rows.Count > 0) 
     { 
      string a = RandomNumberGenerator(4); 
      string b = RandomNumberGenerator(4); 
      string c = RandomNumberGenerator(4); 
      ExamManagement.SP.Passkey_insert(a, b, c).Execute(); 
     } 
    } 
    catch 
    { 
     throw; **// Exception Was Thrown Here** 
    } 



} 
public static string RandomNumberGenerator(int length) 
{ 
    System.Security.Cryptography.RandomNumberGenerator rng = System.Security.Cryptography.RandomNumberGenerator.Create(); 

    char[] chars = new char[length]; 

    //based on your requirment you can take only alphabets or number 
    string validChars = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXzZ"; 

    for (int i = 0; i < length; i++) 
    { 
     byte[] bytes = new byte[1]; 
     rng.GetBytes(bytes); 

     Random rnd = new Random(bytes[0]); 

     chars[i] = validChars[rnd.Next(0, 61)]; 
    } 

    return (new string(chars)); 
} 

} может помочь мне некоторые тела из ... Заранее спасибо .... Ошибка приходит в этой части Кодекса ...

 protected void trigger() 
{ 
    try 
    { 
     DataSet ds = ExamManagement.SP.Questionpaper_SP_Selectall().GetDataSet(); 
     if (ds.Tables[0].Rows.Count > 0) 
     { 
      string a = RandomNumberGenerator(4); 
      string b = RandomNumberGenerator(4); 
      string c = RandomNumberGenerator(4); 
      ExamManagement.SP.Passkey_insert(a, b, c).Execute(); 
     } 
    } 
    catch 
    { 
     throw; **// Exception Was Thrown Here** 
    } 



} 
public static string RandomNumberGenerator(int length) 
{ 
    System.Security.Cryptography.RandomNumberGenerator rng = System.Security.Cryptography.RandomNumberGenerator.Create(); 

    char[] chars = new char[length]; 

    //based on your requirment you can take only alphabets or number 
    string validChars = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXzZ"; 

    for (int i = 0; i < length; i++) 
    { 
     byte[] bytes = new byte[1]; 
     rng.GetBytes(bytes); 

     Random rnd = new Random(bytes[0]); 

     chars[i] = validChars[rnd.Next(0, 61)]; 
    } 

    return (new string(chars)); 
} 

Passkey_insert SP является,

Create Procedure Passkey_insert 
    (
    @red varchar(100), 
    @green varchar(100), 
    @blue varchar(100) 
    ) 
    as 
BEGIN 
BEGIN TRY 
Insert into Passkeys(Red,Green,Blue) values (@red,@green,@blue) 
END TRY 
BEGIN CATCH     
IF @@TRANCOUNT > 0     
ROLLBACK     
DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int     
SELECT @ErrMsg = ERROR_MESSAGE(),     
@ErrSeverity = ERROR_SEVERITY()     
RAISERROR(@ErrMsg, @ErrSeverity, 1)     
END CATCH 
END 
+3

кодекса размещен слишком велик. Можете ли вы разместить соответствующую часть. Кроме того, укажите трассировку стека. – aquaraga

+3

какая линия дает вам ошибку? – Ehsan

+0

Сохранение решения в стороне - блок catch, который вызывает исключение без каких-либо действий, бесполезен. – aquaraga

ответ

2

Длина вашего validChars составляет 50, но здесь у вас есть случайное число от 0 до 61:

chars[i] = validChars[rnd.Next(0, 61)]; 

изменить его:

chars[i] = validChars[rnd.Next(0, 51)]; 
+0

Я изменил его, но еще одно исключение ** Строка или двоичные данные были бы усечены. ** было брошено – Rajesh

+0

Где оно было брошено? Это может произойти, потому что вы пытались вставить больше данных в столбец базы данных, чем это могло бы быть. – gzaxx

+0

В том же месте, где я упомянул вышеприведенный код ..... – Rajesh

0

Ваш массив validChar только 50 символов в ширину, но вы используете validChars [rnd.Next (0, 61)] для поиска полукокса символ

изменение

chars[i] = validChars[rnd.Next(0, 61)]; 

в

chars[i] = validChars[rnd.Next(0, validChars.Length)]; 
+0

Я изменил это, но другое исключение ** Строка или двоичные данные будут усечены. ** было брошено – Rajesh

+0

Это звучит как ошибка SQL, вы уверены, что ваша хранимая процедура Passkey_Insert работает правильно или вы передаете строки, которые слишком длинны Это. – Adrian

+0

Я тоже чувствовал, что также и Chaged my field length от ** varchar (15) ** до ** varchar (100) **, но все же проблема состоит в том, что два часа назад она правильно вставлялась, только проблема возникает ... – Rajesh

1

Вы устанавливаете validChars на массив из 50 символов, то используйте rnd.Next (0, 61), чтобы получить индекс для массива. По определению, он может превышать длину validChars.

Изменить строку:

chars[i] = validChars[rnd.Next(0, 61)]; 

... вместо этого быть:

chars[i] = validChars[rnd.Next(0, validChars.Length)]; 

(обратите внимание, что второй параметр функции Next() является эксклюзивным, поэтому вы будете использовать диапазон от 0 до 49 с этим, совпадающий с вашим массивом)

+0

Я изменил его, но другой Исключение ** Строка или двоичные данные были бы усечены. ** было брошено – Rajesh

+0

Если Passkey_insert() вставляет в базу данных, все три параметра соответствуют критериям? Другими словами, «a», «b» и «c» все 4 символа в длину нарушают вставку? Требуется ли в функции вставки больше или меньше параметров? – DonBoitnott

+0

Вставка SP требует только трех параметров ... – Rajesh

Смежные вопросы